JavaScript四种调用模式

ref:《javascript语言精髓》第四章#函数#调用

方法调用模式:
当一个函数被保存为对象的一个属性时,我们称它为一个方法。当一个方法被调用时,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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值