我现在正在学习JS,我不明白为什么‘Use Strong’指令不适用于setTimeout的回调?据我所知,对于严格的使用,它应该是未定义的,但始终具有全局对象.

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

推荐答案

setTimout()调用浏览器中的函数时,它将this设置为window.这就是它不受严格模式影响的原因--提供了this值,而不是不设置.

setTimeout的规格可以在in the HTML standard

给定WindowOrWorkerGlobalScope global、字符串或Function handler、数字timeout、列表arguments、布尔值repeat,以及可选地(仅当repeat为真)数字previousId,timer initialization steps是:

1.如果是WorkerGlobalScope个对象,则thisArgglobal;否则,thisArg为对应于globalWindowProxy.

[.]

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

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

  2. 如果handlerFunction,则调用给定的处理程序arguments,并将回调This值设置为thisArg.如果这引发异常,则捕获它并报告该异常.

[.]

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

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

f.call(window)

Javascript相关问答推荐

在JavaScript中对大型级联数组进行切片的最有效方法?

提交表格后保留Web表格中的收件箱值?

我可以使用CSS有效地实现最大宽度=100%和最大高度=100%,而无需父母有明确的/固定的宽度和高度,替代方法吗?

Javascript,部分重排序数组

在Angular中将样式应用于innerHTML

将Node.js包发布到GitHub包-错误ENEEDAUTH

如何在 Select 文本时停止Click事件?

一个实体一刀VS每个实体多刀S

无法避免UV:flat的插值:非法使用保留字"

FireBase云函数-函数外部的ENV变量

更改agGRID/Reaction中的单元格格式

有没有办法更改Chart.js 3.x.x中主要刻度的字体?

自动滚动功能在当前图像左侧显示上一张图像的一部分

P5JS-绘制不重叠的圆

如何使用[ModelJSON,ArrayBuffer]调用tf.loadGraphModelSync

bootstrap S JS赢得了REACT中的函数/加载

在范围数组中查找公共(包含)范围

用内嵌的含selenium的Java脚本抓取网站

从客户端更新MongoDB数据库

单击时同时 Select 和展开可访问的行