【问题标题】:Is a function fn passed to setTimeout invoked not as a function but as a method like window.fn()?传递给 setTimeout 的函数 fn 是否不是作为函数调用,而是作为 window.fn() 之类的方法调用?
【发布时间】:2016-02-23 05:20:13
【问题描述】:

在严格模式下,this 应该是undefined 在非方法(函数)内:

http://jsfiddle.net/jfp06nc9/1/
显示thisundefined

但是,当使用setTimeout 时,this 将绑定到window

http://jsfiddle.net/jfp06nc9/2/
http://jsfiddle.net/jfp06nc9/3/
表明 this === window 返回 true。

所以看起来传递给setTimeout 的函数fn 不是作为函数调用,而是作为方法调用,例如window.fn()fn.call(window)(fn.bind(window))()

http://jsfiddle.net/jfp06nc9/4/
显示上面的最后 3 个调用都会将 this === window 显示为 true

这是真的吗?我找不到任何关于它的规范,所以请在你的答案中包含它。

(jsfiddle 在 Chrome 46.0 中运行)

附注这个问题不是关于this 绑定到什么,而是关于在非严格模式下,setTimeout 可以运行fn() 并且this 将绑定到window。但是在严格模式下,如果setTimeout 真的以fn() 运行它,那么this 现在应该是undefined 而不是window,所以那里有一个细微的差别,似乎setTimeout 运行它(或安排运行它)不是fn(),而是fn.call(window)

jsfiddle和代码:

http://jsfiddle.net/jfp06nc9/7/

(function() {
    "use strict";
    setTimeout(function() {
        "use strict";
        console.log(this); 
    }, 1000);
}());

由于函数是在严格模式下运行的,如果作为函数运行,那么this应该是undefined,但实际上是window

【问题讨论】:

标签: javascript this settimeout strict


【解决方案1】:

setTimeout 是 HTML 规范的一部分(与 ECMAScript 相对),它确实明确了 window 应该用于 this

relevant part of the spec如下:

  1. 如果是WorkerGlobalScope 对象,则方法上下文代理方法上下文否则为方法上下文对应的WindowProxy

(强调我的)

还有:

4.2 运行以下列表中的相应步骤:

如果第一个方法参数是函数

致电Function。使用第三个和后续方法参数(如果有)作为调用函数的参数。 使用方法上下文代理作为thisArg来调用函数。

(强调我的)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2015-02-22
    • 2011-04-12
    • 1970-01-01
    • 2021-08-21
    相关资源
    最近更新 更多