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

2023-12-12

我现在正在学习 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

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

规格为setTimeout可以被找寻到在 HTML 标准中

The 定时器初始化步骤,给定一个WindowOrWorkerGlobalScope global、一个字符串或Function handler, 一个号码timeout, 一个列表论点, 一个布尔值repeat,并且可选(并且仅当repeat为真)一个数字上一个 ID, are:

1. Let thisArg be global如果那是一个WorkerGlobalScope目的;否则让thisArg be the WindowProxy对应于global.

[...]

9. Let task是运行以下子步骤的任务:

  1. If id不存在于global的活动计时器地图,然后中止这些步骤。

  2. If handler is a Function,然后调用给定的处理程序论点回调中该值设置为thisArg。如果抛出异常,捕获它并报告异常。

[...]

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

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

f.call(window)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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