【发布时间】:2016-05-08 06:14:05
【问题描述】:
为什么我们不能在 setTimeout 上调用和应用,
var obj={}
window.setTimeout.call(obj,callback,delay);//it throws error stating illegal invocation
【问题讨论】:
标签: javascript call settimeout apply
为什么我们不能在 setTimeout 上调用和应用,
var obj={}
window.setTimeout.call(obj,callback,delay);//it throws error stating illegal invocation
【问题讨论】:
标签: javascript call settimeout apply
在setTimeout 上使用.call 毫无意义,因为.call 旨在调用一个函数并在调用该函数时为其提供上下文。换句话说,您不是在尝试使用提供给它的上下文来调用 setTimeout,而是在尝试调用 回调 提供给它的上下文。
要使用 setTimeout 完成此操作,您可以使用 .bind,如下所示:
var obj={};
window.setTimeout(callback.bind(obj),delay);
【讨论】:
来自WHATWG setTimeout documentation:
setTimeout() 方法必须返回定时器初始化步骤返回的值,将方法的参数传递给它们,算法运行所针对的方法在其上实现的对象(Window 或 WorkerGlobalScope 对象)为方法上下文,并将重复标志设置为 false。
setTimeout 需要从 window 对象的上下文中调用。传递给.call 方法的上下文不是窗口对象。要正确调用setTimeout,请执行以下操作:
setTimeout.call(window, callback, delay);
【讨论】: