使用function.prototype.call作为回调



我在Google Chrome Console中尝试了以下内容:

> function t1(f) { return f(1); }
> function t2() { return this+1; }
> t1(t2.call)
TypeError: object is not a function

为什么这不起作用?有没有办法定义函数代替函数。prototype.call可以在这里工作?

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


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

t1(t2.call.bind(t2))

这将t2函数绑定为.callthis值,这意味着您将调用.call,就好像您已经完成了:

t2.call

...这是您想要的。


IE8和其他一些较旧的浏览器中不支持.bind方法,但是在这种情况下,您可以实现大部分完整的垫片。


fyi,如果您需要很多,则可以将.call绑定为.bind的调用上下文以缩短它。

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

因此,现在您拥有一个.bind()功能,其中.call()绑定为其呼叫上下文。当您调用它时,就好像您正在这样做一样:

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

因此,callBind()将返回具有the function作为.call的调用上下文的函数,就像我们上面所做的那样。因此,您会这样使用:

t1(callBind(t2))

为什么要遇到困难?您不能仅通过回调函数t2发送到t1并在t1中使用call()

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

最新更新