为什么在对字符串使用 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
) 提供给 setTimeout
。 setTimeout
虽然不会抛出错误 - 它有一个旧的“功能”,如果您将字符串传递给它,它会像您使用 eval
.
一样对其进行评估
undefined
不是字符串,但也不是函数,因此当计时器到期时,setTimeout
会将其转换为字符串 ("undefined"
) 并尝试 eval
它。这就是您收到警告的原因。
您可以通过将您的函数传递给 setTimeout
“好的方法”来解决此问题:将您的调用包装到另一个函数中。这样,您的外部函数将在调用 it 时调用 console.log
,因此您可以将其传递给 setTimeout
:
setTimeout(() => console.log(`String`), 100);
这是它在 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
) 提供给 setTimeout
。 setTimeout
虽然不会抛出错误 - 它有一个旧的“功能”,如果您将字符串传递给它,它会像您使用 eval
.
undefined
不是字符串,但也不是函数,因此当计时器到期时,setTimeout
会将其转换为字符串 ("undefined"
) 并尝试 eval
它。这就是您收到警告的原因。
您可以通过将您的函数传递给 setTimeout
“好的方法”来解决此问题:将您的调用包装到另一个函数中。这样,您的外部函数将在调用 it 时调用 console.log
,因此您可以将其传递给 setTimeout
:
setTimeout(() => console.log(`String`), 100);