3

我在 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 在这里可以工作?

4

2 回答 2

5

它不起作用,因为当你通过时t2.call,你实际上只是在通过.call。换句话说,它不记得传递它的对象。


要完成您想要的,您可以使用.bind().

t1(t2.call.bind(t2))

t2这会将函数绑定为 的this.call,这意味着您将.call像执行此操作一样调用:

t2.call

...这就是你想要的。


.bindIE8 及更低版本以及其他一些较旧的浏览器不支持该方法,但在这些情况下您可以实现大部分完整的 shim。


仅供参考,如果你需要这个很多,你可以绑定.call为调用上下文.bind来缩短它。

var callBind = Function.prototype.bind.bind(Function.prototype.call);

所以现在你有一个.bind().call()bound 作为其调用上下文的函数。当您调用它时,就好像您正在这样做:

.call.bind(/* the function */)

所以callBind()将返回一个以the functionbound 作为 的调用上下文的函数.call,就像我们在上面所做的那样。所以你会像这样使用它:

t1(callBind(t2))
于 2012-11-04T03:22:40.803 回答
2

为什么要以艰难的方式做事?您不能将回调函数发送t2t1call()在内部使用t1吗?

function t1(f) { 
    return f.call(1); 
}

function t2() { 
    return this+1; 
}

t1(t2);
于 2012-11-04T03:23:25.093 回答