为什么我们不能在setTimeout上使用call和apply?

3

为什么我们不能在setTimeout上使用call和apply方法?


var obj={}
window.setTimeout.call(obj,callback,delay);//it throws error stating illegal invocation 
2个回答

3

setTimeout 上使用 .call 没有意义,因为 .call 是用来调用函数并在调用时提供上下文的。换句话说,你不是想要为 setTimeout 提供上下文来调用它,而是想要为回调函数callback 提供上下文。

要在 setTimeout 中实现这一点,可以使用 .bind,例如:

 var obj={};
 window.setTimeout(callback.bind(obj),delay);

2
根据WHATWG setTimeout文档,setTimeout()方法必须返回定时器初始化步骤返回的值,并将该方法的参数、实现该算法的方法所在的对象(Window或WorkerGlobalScope对象)作为方法上下文传递给它们,并将重复标志设置为false。
setTimeout需要从window对象的上下文中调用。传递到call方法中的上下文不是window对象。要正确调用setTimeout,请执行以下操作:
setTimeout.call(window, callback, delay);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接