在上一篇博文中,最后讨论Function.prototype.call的内部实现近似为:
function call(a,b,c){
if(this === call){
a(b,c);
}else{
this(b,c);
}
}
?应修正为:
function call(a,b,c){
if(this === call){
a.call(b,c);
}else{
this(b,c);
}
}
?证明过程如下:
function f1(){
alert(this.xxx);
}
f1.xxx = "f1xxx";
function f2(){
alert(2);
}
f2.xxx = "f2xxx";
Function.prototype._call = Function.prototype.call;
Function.prototype.call = function(bind,arg){
alert(this);
this._call(bind,arg);
}
var f3 = f1.call;
f1.call(f2);
f3.call(f1,{xxx:"xxx"})
?通过最后alert出来的结果,可以看到Function.prototype.call.call确实调用了两次call方法。
1 楼
gr205925
2011-10-15
这篇更看不明白,这个两次是怎么证明出来的。
首先,fn.call.call就是两次对call的调用,在绑定后的call中的alert会有两次,再加上一次fn的调用
其次,伪代码中添加一个call调用的猜测其实是多余的,因为call函数的实现其实是native code,因此在call的实现内部,对外部所有的任何绑定是无感的,也就是说扩展call来证明本身就不会得到想要的结果。甚至于,call内部还需不需要call这种概念的函数都是由js引擎设计者的决定,没有标准存在。
首先,fn.call.call就是两次对call的调用,在绑定后的call中的alert会有两次,再加上一次fn的调用
其次,伪代码中添加一个call调用的猜测其实是多余的,因为call函数的实现其实是native code,因此在call的实现内部,对外部所有的任何绑定是无感的,也就是说扩展call来证明本身就不会得到想要的结果。甚至于,call内部还需不需要call这种概念的函数都是由js引擎设计者的决定,没有标准存在。