为什么在对字符串使用 setTimeout 时会看到不安全评估警报?

Why I see unsafe-eval alert when using setTimeout with strings?

这是它在 Chrome 开发工具中的显示示例:

setTimeout(console.log(`String`), 100);

String 拒绝将字符串评估为 JavaScript,因为 'unsafe-eval' 不是以下内容安全策略指令中允许的脚本源:“script-src'self' 'unsafe-inline' https :".

此警报是什么意思,对字符串使用 setTimeout 的安全问题是什么?

您使用的 setTimeout 错误。

当你在 JS 中的一个函数后面附加括号时,它会立即调用该函数,并用该函数的 return 值“替换”表达式。

但是,对于 setTimeout,您 不想 调用该函数,您希望 setTimeout 调用它!为此,您 将函数 交给 setTimeout 而无需调用它,并且 setTimeout 将在计时器关闭时在内部为您调用它。

但是您的代码确实调用了函数 console.log,并且只将其 return 值 (undefined) 提供给 setTimeoutsetTimeout 虽然不会抛出错误 - 它有一个旧的“功能”,如果您将字符串传递给它,它会像您使用 eval.

一样对其进行评估

undefined 不是字符串,但也不是函数,因此当计时器到期时,setTimeout 会将其转换为字符串 ("undefined") 并尝试 eval它。这就是您收到警告的原因。


您可以通过将您的函数传递给 setTimeout “好的方法”来解决此问题:将您的调用包装到另一个函数中。这样,您的外部函数将在调用 it 时调用 console.log,因此您可以将其传递给 setTimeout:

setTimeout(() => console.log(`String`), 100);