在Javascript中函数就是对象。
对象是“名/值”对的集合并拥有一个连到原型对象的隐藏连接。
对象字面量产生的对象连接到Object.prototype。
函数对象连接到Function.prototype(该原型对象本身连接到Object.prototype)。
此外,每个函数对象在创建时也随带有一个 prototype 属性。它的值是一个拥有 constructor 属性且值即为该函数的对象。(所以函数又是构造函数。函数本身加上其 prototype 属性就基本具备了类的全部功能!)
因为函数是对象,所以它们可以像任何其他的值一样被使用。函数可以存放在变量、对象和数组中,函数可以被当作参数传递给其他函数,函数可以再返回函数,函数还可以拥有方法。
闭包:一个函数能够访问它被嵌套在其中的那个函数的参数与变量的特性称为闭包。
函数对象可以通过函数字面量来创建:
//创建一个名为 add 的函数
var add = function(a,b){
return a + b;
};
函数的四种调用模式:
每个函数都有两个默认的参数:this 和 arguments。参数 this 在不同的调用模式中是存在差异的。
1、方法调用模式。
当一个函数被保存为对象的一个属性时,我们称它为一个方法。this 被绑定到该对象。
// 创建 myObject 。它有一个 value 属性和一个 increment 方法。
// increment 方法接受一个可选的参数。如果参数不是数字,那么默认使用数字1。
var myObject = {
value:0,
increment:function(inc){
this.value += typeof inc === "number" ? inc : 1;
}
};
myObject.increment();
document.writeln(myObject.value); //1
myObject.increment(2);
document.writeln(myObject.value); //3
2、函数调用模式
如:
var sum = add(3,5);
当函数以此模式调用时成为函数式调用。此时 this 被绑定到全局对象。这是语言设计上的一个错误。
myObject.double = function(){
var that = this;
var helper = function(){
that.value += that.value;
}
helper(); //函数调用模式
}
// 以方法的形式调用double
myObject.double();
document.write(myObject.value);