将 setTimeout 与字符串一起使用会触发不安全评估警报

问题描述 投票:0回答:1

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

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

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

此警报意味着什么以及将 setTimeout 与字符串一起使用的安全问题是什么?

javascript settimeout eval
1个回答
5
投票

您使用了

setTimeout
错误。

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

但是,对于

setTimeout
,您不想 想要调用该函数,您希望
setTimeout
调用它!为此,您将函数交给
setTimeout
而不调用它,当计时器关闭时,
setTimeout
将在内部为您调用它。

但是您的代码确实调用了函数

console.log
,并且仅将其返回值 (
undefined
) 赋予
setTimeout
。不过
setTimeout
不会抛出错误 - 它有一个旧的“功能”,如果您向它传递一个字符串,它会像您使用
eval
一样对其进行评估。

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


您可以通过将函数传递给

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

setTimeout(() => console.log(`String`), 100);
© www.soinside.com 2019 - 2024. All rights reserved.