在严格模式下,this应该是非方法(函数)内的undefined:
请参阅http://jsfiddle.net/jfp06nc9/1/
显示this是undefined
但是,当使用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 === window为true。
这是真的吗?我找不到任何关于它的说明,所以请把它写在你的答复中。
(在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/
(function() {
"use strict";
setTimeout(function() {
"use strict";
console.log(this);
}, 1000);
}());由于函数以严格的模式运行,如果它是作为函数运行的,那么this 应该是 undefined ,但实际上它是 window。
发布于 2015-11-20 16:55:09
setTimeout是HTML (相对于ECMAScript)的一部分,它确实澄清了window应该用于this。
规范的相关部分如下:
WorkerGlobalScope对象,则为,或者是对应于方法上下文的。(强调地雷)
连同:
4.2从以下列表中运行适当的步骤集: 如果第一个方法参数是一个函数 打给
Function。使用第三个和后续的方法参数(如果有的话)作为调用函数的参数。thisArg使用方法上下文代理作为来调用.函数。
(强调地雷)
https://stackoverflow.com/questions/33831452
复制相似问题