下面是它在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
)给setTimeout
。setTimeout
不会抛出错误——它有一个旧的"特性"。如果你传递一个字符串给它,它会像你使用eval
一样计算它。
undefined
不是字符串,但也不是函数,所以当计时器到期时,setTimeout
将其转换为字符串("undefined"
)并尝试eval
它。这就是为什么你会得到警告。
您可以通过将函数传递给setTimeout
"好方法"来解决这个问题:将调用封装到另一个函数中。这样,当it被调用时,您的外部函数将调用console.log
,因此您可以将其传递给setTimeout
:
setTimeout(() => console.log(`String`), 100);