为什么 setTimeout 中的回调即使在严格模式下也会有 this == Window ?

5 javascript settimeout

我现在正在学习 JS,不明白为什么“use strict”指令不适用于 setTimeout 的回调?据我所知,对于 use strict 它应该是未定义的,但始终具有全局对象。

function f() {
    'use strict'
    console.log(this === window)
}

function g() {
    console.log(this === window)
}

setTimeout(g,1000) // expect true, have true
setTimeout(f,1000) // expect false, have true
Run Code Online (Sandbox Code Playgroud)

VLA*_*LAZ 5

setTimout()在浏览器中调用函数时,它将设置thiswindow。这就是为什么它不受严格模式的影响 -this提供该值,而不是保持未设置状态。

规范可以在 HTML 标准中setTimeout找到

给定一个全局、一个字符串或处理程序、一个数字超时、一个列表参数、一个布尔值重复和可选的(并且仅当重复为 true 时)数字previousId ,计时器初始化步骤是:WindowOrWorkerGlobalScope Function

1.如果thisArg是一个对象,则将其设为全局WorkerGlobalScope;否则让thisArgWindowProxy对应于global 的

[...]

9. 令任务为运行以下子步骤的任务:

  1. 如果id不存在于global的活动计时器映射中,则中止这些步骤。

  2. 如果handler是 a Function,则调用给定参数的处理程序,并将回调 this 值设置为thisArg。如果抛出异常,捕获它并报告异常。

[...]

本质上,结果类似于调用函数,如下所示:

function f(){
 'use strict'
 console.log(this)
}

f.call(window)
Run Code Online (Sandbox Code Playgroud)