Javascript 使用Function.prototype.call作为回调
我在Google Chrome控制台中尝试了以下操作:Javascript 使用Function.prototype.call作为回调,javascript,function,callback,Javascript,Function,Callback,我在Google Chrome控制台中尝试了以下操作: > function t1(f) { return f(1); } > function t2() { return this+1; } > t1(t2.call) TypeError: object is not a function 为什么这不起作用?有没有一种方法可以定义一个函数来代替function.prototype.call在这里工作?它不工作,因为当你传递t2.call时,你实际上只是传递.call。换句话
> function t1(f) { return f(1); }
> function t2() { return this+1; }
> t1(t2.call)
TypeError: object is not a function
为什么这不起作用?有没有一种方法可以定义一个函数来代替function.prototype.call在这里工作?它不工作,因为当你传递
t2.call
时,你实际上只是传递.call
。换句话说,它不记得从哪个对象传递它
要实现您想要的功能,可以使用
.bind()
这将t2
函数绑定为.call
的This
值,这意味着您将调用.call
,就好像您已经这样做了:
t2.call
…这正是你想要的
IE8和更低版本以及其他一些较旧的浏览器不支持
.bind
方法,但在这些情况下,您可以实现一个基本完整的垫片
仅供参考,如果您非常需要,可以将
.call
绑定为.bind
的调用上下文,以将其缩短一点
var callBind = Function.prototype.bind.bind(Function.prototype.call);
现在您有了一个.bind()
函数,它的调用上下文是.call()
绑定。当您调用它时,就好像您正在这样做:
.call.bind(/* the function */)
因此,callBind()
将返回一个函数,该函数的绑定为.call
的调用上下文,就像我们上面所做的那样。所以你可以这样使用它:
t1(callBind(t2))
为什么事情会如此艰难?您不能将回调函数t2
发送到t1
并在t1
内部使用call()
function t1(f) {
return f.call(1);
}
function t2() {
return this+1;
}
t1(t2);
嗯,这真的更像是个人的熏陶。不过,谢谢你的建议。“它不起作用,因为当你通过t2.call时,你实际上只是通过了。call。换句话说,它不记得从哪个对象传递它。”如果可能的话,你能再解释一下吗?我不太明白为什么它不记得对象。@Ray:.call
只是对象的一个属性。对象和函数之间的唯一关系是将函数指定给属性。当您将t1.call
传递给另一个函数时,您正在从t1
对象检索函数,但只传递函数,而不是对象。就像我递给你一样,而你却把它带到了某个地方。一旦我放手,我和那东西之间的关系就破裂了,那东西跟我没有联系。啊,好吧,我想我明白了。这就像一个普通的对象/属性,比如说o={name:“foo”}
。然后你调用f(o.name)
这只是发送的属性.name
不再带有o
的附件/引用。。。是 啊
function t1(f) {
return f.call(1);
}
function t2() {
return this+1;
}
t1(t2);