【问题标题】:why can't we do call and apply on setTimeout?为什么我们不能调用并应用 setTimeout?
【发布时间】: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


    【解决方案1】:

    setTimeout 上使用.call 毫无意义,因为.call 旨在调用一个函数并在调用该函数时为其提供上下文。换句话说,您不是在尝试使用提供给它的上下文来调用 setTimeout,而是在尝试调用 回调 提供给它的上下文。

    要使用 setTimeout 完成此操作,您可以使用 .bind,如下所示:

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

    【讨论】:

      【解决方案2】:

      来自WHATWG setTimeout documentation

      setTimeout() 方法必须返回定时器初始化步骤返回的值,将方法的参数传递给它们,算法运行所针对的方法在其上实现的对象(Window 或 WorkerGlobalScope 对象)为方法上下文,并将重复标志设置为 false。

      setTimeout 需要从 window 对象的上下文中调用。传递给.call 方法的上下文不是窗口对象。要正确调用setTimeout,请执行以下操作:

      setTimeout.call(window, callback, delay);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-09
        • 2014-11-08
        • 1970-01-01
        • 2010-12-30
        • 1970-01-01
        相关资源
        最近更新 更多