首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >传递给setTimeout的函数fn不是作为函数调用,而是作为像window.fn()这样的方法调用吗?

传递给setTimeout的函数fn不是作为函数调用,而是作为像window.fn()这样的方法调用吗?
EN

Stack Overflow用户
提问于 2015-11-20 16:25:24
回答 1查看 70关注 0票数 4

在严格模式下,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的函数不是作为函数调用的,而是作为方法调用的,比如window.fn()fn.call(window)(fn.bind(window))()

请参阅http://jsfiddle.net/jfp06nc9/4/

上面显示的最后3个调用都将显示this === windowtrue

这是真的吗?我找不到任何关于它的说明,所以请把它写在你的答复中。

(在Chrome 46.0中运行的是jsfiddle )

这个问题不是关于this 绑定到什么,而是关于在非严格模式下, setTimeout 可以运行 fn() ,而 this 将绑定到e 240 window**.。但是在严格模式下,如果** setTimeout 真的以 fn()**,的方式运行它,那么** this 现在应该是 undefined 而不是 window**,,因此这里有一个微妙的区别,似乎** setTimeout 运行它(或安排运行它)不是作为 fn() ,而是作为e 274 fn.call(window)

的jsfiddle和代码:

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

代码语言:javascript
复制
(function() {
    "use strict";
    setTimeout(function() {
        "use strict";
        console.log(this); 
    }, 1000);
}());

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

EN

回答 1

Stack Overflow用户

发布于 2015-11-20 16:55:09

setTimeout是HTML (相对于ECMAScript)的一部分,它确实澄清了window应该用于this

规范的相关部分如下:

  1. 让方法上下文代理是方法上下文,如果是WorkerGlobalScope对象,则为,或者是对应于方法上下文

(强调地雷)

连同:

4.2从以下列表中运行适当的步骤集: 如果第一个方法参数是一个函数 打给Function。使用第三个和后续的方法参数(如果有的话)作为调用函数的参数。thisArg 使用方法上下文代理作为来调用.函数。

(强调地雷)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33831452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档