1,介绍
- 函数实际上是对象,每个函数都是Function类型的实例。
- 和其他引用类型一样具有属性和方法。
- 函数名实际上是一个指向对象的指针,不会与某个函数绑定。
- 函数可作为参数,返回值来使用。
2,定义
使用函数声明语法定义
function sum(num1,num2){ return num1 + num2; }
使用函数表达式定义
var sum = function(num1,num2){ return num1 + num2; }
- 使用Function构造函数(不推荐,这种语法会导致解析两次代码)
接收任意数量的参数,但最后一个参数始终都被看成是函数体,前面的参数枚举出了新函数的参数,例:
var sum = new Function("num1","num2","return num1 + num2");
3,函数声明与函数表达式
解析器对函数声明和函数表达式并非一视同仁。
- 解析器会率先读取函数声明(函数声明提升),并使其在执行任何代码之前可用(放到源代码树的顶部)。
- 函数表达式,必须等到解析器执行到它所在的代码行,才会被解释执行。
- 除了什么时候可以通过变量访问函数这一点区别之外,函数声明与函数表达式的语法等价。
4,没有重载的深入理解
函数名实际上是一个指针或变量,所以相似的,定义两个相同名字的函数,后者会覆盖前者。
5,函数内部属性
- arguments
用来保存函数参数,这个对象还有一个名叫callee的属性,ECMAScript 5 还定义了caller属性
- callee
该属性是一个指针,指向拥有这个arguments对象的函数。 - caller
在严格模式下访问它对导致错误,在非严格模式下,这个属性始终是undefined。
- callee
- this
引用的是函数据以执行的环境对象,行为和Java和C#中的this大致类似。 - caller
这个属性中保存着调用当前函数的函数的引用,ECMAScript 5规范化了一个函数对象的caller属性。如果是在全局作用域中调用当前函数,它的值为null。
6,函数属性和方法
- 属性
每个函数都包含两个属性length和prototype
- length
表示函数希望接收的命名参数的个数 - prototype
- prototype是保存引用类型所有实例共享的方法和属性,诸如toString()和valueOf()等方法实际上都保存在prototype名下。
- 该属性是不可枚举的,无法使用for-in来发现。
- 如果函数为构造函数,可以理解通过该构造函数创建的那个对象实例的原型对象,原型对象可以让所有对象实例共享它所包含的属性和方法。
- 默认情况下prototype会获取一个constructor属性,这个属性包含一个指向prototype属性所在的函数的指针。
- length
- 方法
每个函数都包含两个非继承而来的方法,apply()和call()。这两个方法的用途是为了设置函数体内的this对象的值。
- apply()
接收两个参数(1)this所引用的对象,(2)参数数组。其中第二个参数可以使Array的实例,也可以使arguments对象。 - call()
与apply()方法作用相同,区别在于接收参数的方式不同,第一个参数是this值没有变化,变化的是其余参数都是直接传递给函数。 - apply()和call()的好处
- 扩充函数来一运行的所用域。
- 对象不需要与方法有任何的耦合关系。
- bind()
这是ECMAScript 5定义的一个方法,其this值会被绑定到传给bind()函数的值。 - 继承的方法
toLocaleString()和toString(),valueOf()返回函数的代码,主要用在调试代码。
- apply()