对字符串使用setTimeout会触发不安全的eval警报



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

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

字符串拒绝将字符串作为JavaScript计算,因为在以下内容安全策略指令中'unsafe-eval'不允许作为脚本的来源:" script-src'self' 'unsafe-inline' https:"

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

你用错了setTimeout

在JS中,当你在函数后面添加父元素时,它会立即调用该函数,并"替换"。带有返回值的表达式。

但是,对于setTimeout,您不想调用该函数,您希望setTimeout调用它!要做到这一点,您函数给setTimeout而不调用它,并且当计时器关闭时setTimeout将在内部为您调用它。

但是您的代码确实调用了函数console.log,并且只将其返回值(undefined)给setTimeoutsetTimeout不会抛出错误——它有一个旧的"特性"。如果你传递一个字符串给它,它会像你使用eval一样计算它。

undefined不是字符串,但也不是函数,所以当计时器到期时,setTimeout将其转换为字符串("undefined")并尝试eval它。这就是为什么你会得到警告。


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

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

最新更新