Javascript 为什么窗口仍然在这个严格的模式代码中定义?

Javascript 为什么窗口仍然在这个严格的模式代码中定义?,javascript,Javascript,setTimeout调用的函数中的“this”应该引用全局对象,但我还有“use strict”;在身体里。但它记录的是窗口而不是未定义的,这正是我所期望的。这里发生了什么?因为这实际上: "use strict"; setTimeout(function() {"use strict";console.log(this)}, 1000); 实际上,您可以使用window对象调用setTimeout,尽管您没有编写它。调用函数时,它会在窗口的上下文中传递 运行算法的方法在其上实现的对象(窗口

setTimeout调用的函数中的“this”应该引用全局对象,但我还有“use strict”;在身体里。但它记录的是窗口而不是未定义的,这正是我所期望的。这里发生了什么?

因为这实际上:

"use strict";

setTimeout(function() {"use strict";console.log(this)}, 1000);
实际上,您可以使用window对象调用setTimeout,尽管您没有编写它。

调用函数时,它会在
窗口的上下文中传递

运行算法的方法在其上实现的对象(窗口或WorkerGlobalScope对象)作为方法上下文


这类似于调用
你的函数。应用(窗口)
而不是
你的函数()

中有一个注释,正好解决了这个问题

设置超时
回调的默认
值仍然是
窗口
对象,而不是
未定义
,即使在严格模式下也是如此


这也适用于
setInterval
,即使没有提到它。

你从哪里知道窗口不是在严格模式下定义的?我没有。我了解到引用全局对象的“this”是未定义的。@bingjie2680:这就是他所指的:谢谢,但是回调函数中的这个不应该仍然是未定义的吗?问题也很好,我认为上下文保持不变。因为回调函数是在setTimeout内调用的。@ZackGao不,它不应该。检查es5规范和DOM定时器API。这不是函数运行时将
This
设置为全局上下文(
window
)的原因。它的工作方式很简单,因为它是以这种方式实现的。@ZackGao:它会的,除了
setTimeout
显式地将
this
值设置为
window
。把它看作是回调。调用(窗口,…)
;就像在事件处理程序中一样,这里的
this
指的是接收事件的元素!值得一提的是,NodeJS实现了一个稍有不同的timersapi,并且出于明显的原因,它没有将
this
值设置到窗口。相反,它将
这个
值设置为超时对象本身(在浏览器中称为clearTimeout,在浏览器中它只是一个数字,在节点中它是一个对象)。此外,正如回答中所述,当在web worker中运行时,出于明显的安全原因,它不会设置为
窗口
对象,而是设置为worker全局范围。
  window.setTimeout(function() {"use strict";console.log(this)}, 1000);