【发布时间】:2016-02-23 05:20:13
【问题描述】:
在严格模式下,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 的函数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
【问题讨论】:
-
请将相关代码添加到问题中,而不是在小提琴中。
-
MDN does explain this 在他们的
setTimeout()文档中。 -
是的,确实如此,windows 有很多函数,比如 alert、setTimeout、setInterval 等。developer.mozilla.org/en-US/docs/Web/API/Window 这就是为什么你把它作为窗口对象
-
您的问题确实与
setTimeout()无关,但它与this在Javascript 中的工作方式有关。它不同于其他语言,如 Java、C++ 和 Python。 MDN documentationexplanation on Quirksmode
标签: javascript this settimeout strict