Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Function.prototype.call作为回调_Javascript_Function_Callback - Fatal编程技术网

Javascript 使用Function.prototype.call作为回调

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。换句话

我在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
。换句话说,它不记得从哪个对象传递它


要实现您想要的功能,可以使用
.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);