我现在正在学习 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 trueRun Code Online (Sandbox Code Playgroud)
当setTimout()在浏览器中调用函数时,它将设置this为window。这就是为什么它不受严格模式的影响 -this提供该值,而不是保持未设置状态。
规范可以在 HTML 标准中setTimeout找到
给定一个全局、一个字符串或处理程序、一个数字超时、一个列表参数、一个布尔值重复和可选的(并且仅当重复为 true 时)数字previousId ,计时器初始化步骤是:
WindowOrWorkerGlobalScopeFunction1.如果thisArg是一个对象,则将其设为全局
WorkerGlobalScope;否则让thisArg为WindowProxy对应于global 的。[...]
9. 令任务为运行以下子步骤的任务:
如果id不存在于global的活动计时器映射中,则中止这些步骤。
如果handler是 a
Function,则调用给定参数的处理程序,并将回调 this 值设置为thisArg。如果抛出异常,捕获它并报告异常。[...]
本质上,结果类似于调用函数,如下所示:
function f(){
'use strict'
console.log(this)
}
f.call(window)Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
302 次 |
| 最近记录: |