ref:《javascript语言精髓》第四章#函数#调用
方法调用模式:
当一个函数被保存为对象的一个属性时,我们称它为一个方法。当一个方法被调用时,this被绑定到该对象。
如果一个调用表达式包含一个属性存取表达式("."或"[]"),那么它被当作一个方法来调用。
方法可以使用this去访问对象,所以它能从对象中取值或修改该对象。this到对象的绑定发生在调用的时候。
通过this可取的它们所属对象的上下文的方法称为公共方法。
函数调用模式:
当函数以此模式调用时,this被绑定到全局对象。这是语言设计上的一个错误(书作者说的)。
当内部函数(在内部)被调用时,this应该仍然绑定到外部函数的this变量。
这个设计错误的后果是方法不能利用内部函数来帮助它工作。
因为内部函数的this被绑定了错误的值,所以不能共享该方法对对象的访问权。
解决方案:
如果该方法定义一个变量并给他赋值为this,那么内部函数就可以通过这个变量访问到this。
构造器调用模式
JavaScript基于原型继承的语言。
如果在一个函数前面带上new来调用,那么将创建一个隐藏链接到该函数的prototype成员的新对象,
同时this将绑定到新对象上。
Apply/Call调用模式:
apply/call方法介绍参考
http://www.cnblogs.com/fighting_cp/archive/2010/09/20/1831844.html
方法调用模式:
当一个函数被保存为对象的一个属性时,我们称它为一个方法。当一个方法被调用时,this被绑定到该对象。
如果一个调用表达式包含一个属性存取表达式("."或"[]"),那么它被当作一个方法来调用。
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
方法可以使用this去访问对象,所以它能从对象中取值或修改该对象。this到对象的绑定发生在调用的时候。
通过this可取的它们所属对象的上下文的方法称为公共方法。
函数调用模式:
var sum = add(2,3)
当函数以此模式调用时,this被绑定到全局对象。这是语言设计上的一个错误(书作者说的)。
当内部函数(在内部)被调用时,this应该仍然绑定到外部函数的this变量。
这个设计错误的后果是方法不能利用内部函数来帮助它工作。
因为内部函数的this被绑定了错误的值,所以不能共享该方法对对象的访问权。
解决方案:
如果该方法定义一个变量并给他赋值为this,那么内部函数就可以通过这个变量访问到this。
myObject.double = function(){
var that = this;
var helper = function (){
that.value = add(that.value,that.value);
};
helper(); // 函数调用模式调用helper
};
// 方法调用模式调用double
myObject.double();
document.writenln(myObject.getValue());
构造器调用模式
JavaScript基于原型继承的语言。
如果在一个函数前面带上new来调用,那么将创建一个隐藏链接到该函数的prototype成员的新对象,
同时this将绑定到新对象上。
// 旧模式:基于类的对象构建语法
// 构造器(一般大写),带status属性
var Cons = function(status){
this.status = status;
};
// 给Cons一个getStatus的公共方法
Cons.prototype.getStatus = function(){
return this.status;
}
// 构造Cons实例
var myObject = new Cons("normal");
myObject.getStatus();
Apply/Call调用模式:
function print(a, b, c, d){
alert(a + b + c + d);
}
function example(a, b , c , d){
//用call方式借用print,参数显式打散传递
print.call(this, a, b, c, d);
//用apply方式借用print, 参数作为一个数组传递,
//这里直接用JavaScript方法内本身有的arguments数组
print.apply(this, arguments);
//或者封装成数组
print.apply(this, [a, b, c, d]);
}
apply/call方法介绍参考
http://www.cnblogs.com/fighting_cp/archive/2010/09/20/1831844.html