type
status
date
slug
summary
tags
category
icon
password
| 函数声明 | 函数表达式 | 函数构造器
---|---|---|---|
前置 | 是 | |
允许匿名 | | 是 | 是
可立即调用 | | 是 | 是
在定义该函数的作用域通过函数名访问 | 是 | |
没有函数名 | | | 是
JavaScript 特点
函数
- js函数的参数并不会验证传递进来多少个参数, 也不会在乎传进来的参数是什么数据类型, 在函数体内可以用arguments对象来访问这个参数数组.
- arguments对象中的值会与命名参数的值同步修改, 即修改arguments值时会同步修改参数的值, 反之亦然.
- js中函数没有重载
- Js中每个函数都是Function类型的实例,因而与其他引用类型一样具有属性和方法。
- 函数内部有两个特殊对象arguments和this
- arguments.callee 指向拥有这个arguments对象的函数。可用于消除与函数名的紧耦合
- arguments.caller 保存着调用当前函数的函数的引用
- this 对象引用的是函数据以执行的环境对象
- 函数中包含两个属性length和prototype
- length 表示函数希望接收的命名参数个数
- prototype 保存函数所有实例方法的真正所在,例如toString()和valueOf()等
- 每个函数包含的方法:
apply()
、call()
和bind()
JavaScript 的变量和作用域
- 基本类型的复制是完全独立的复制值复制, 引用类型的复制实际上是复制的一份指针.
- js中所有函数的参数都是按值传递, 基本类型传递如同基本类型变量复制一样, 引用类型传递如同引用变量复制一样.
- try-catch语句的catch快和with语句会延长作用域链
- js中没有块级作用域, for/if花括号中定义的变量在花括号外也可访问.
引用变量
- Js中面向对象未实现面向对象的类和接口等基本结构,一般称为引用类型或对象定义。
- 访问对象的属性除了通用的
.
,还可使用[]
,从而通过变量来访问对象属性。
- 为了便于操作基本类型值,Js提供了基本类型的自动包装功能,每单读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,并在调用后自动销毁。
- 由于基本包装类型和基本类型的含义并不一样,会导致typeof等操作产生不同的结果,不推荐显示实例化基本数据类型
函数的调用
- 直接调用 foo();
- 对象方法 o.method();
- 构造器 new Function();
- call/apply/bind func.call(o);
函数声明和表达式
函数声明会被前置,函数表达式变量声明会被前置,但是值为
undefined
。函数声明
函数表达式
- 将函数赋值给一个变量
- 匿名函数(IEF 立即执行函数表达式)
- 返回函数对象
- 命名函数表达式(NEF)
命名函数表达式存在一些经典的bug,例如在执行如下代码时:
IE6会提示为
false
,IE9+中nfe外部并不可见,提示为nfe is undefined
。命名函数表达式主要可以应用在调试和递归调用时。
但也可直接通过
func
变量名来执行递归调用,因此命名函数表达式并不常用。function构造器
function构造器的作用域
各方式对比
ㅤ | 函数声明 | 函数表达式 | 函数构造器 |
前置 | 是 | ㅤ | ㅤ |
允许匿名 | ㅤ | 是 | 是 |
可立即调用 | ㅤ | 是 | 是 |
在定义该函数的作用域通过函数名访问 | 是 | ㅤ | ㅤ |
没有函数名 | ㅤ | ㅤ | 是 |
this
全局的this
全局的this一般即是浏览器
一般函数的this
一般函数的this仍然指向全局对象,浏览器中即为window
严格模式下,this指向undefined
作为对象方法的函数this
对象方法中的函数this会指向具体的对象
也可以通过外部定义函数
通过call
和apply
调用指定this
一般模式和严格模式下使用
apply
的区别'bind'方法与this
通过ES5提供的bind方法,可以将函数的this绑定到一个对象上,bind之后this不可变。
函数属性和对象
使用
bind()
方法currying函数bind和new的使用