为什么这段代码有效?
setTimeout("document.body.innerHTML = 'TEST'", 1000)
不应该吗?
setTimeout(function() {
document.body.innerHTML = 'TEST'
}, 1000)
setTimeout
如何将字符串转换为函数?
答案 0 :(得分:6)
引用MDN' setTimeout documentation
备用语法中的代码是您希望在延迟毫秒后执行的一串代码(建议不要使用此语法,原因与使用
eval()
相同)
正如MDN中所建议的那样,最好避免setTimeout
中的字符串,因为字符串传递的实现可能eval
。
这不仅仅是一个浏览器实现的东西,而且HTML规范本身也是这样定义的this section
handle = window . setTimeout( code [, timeout ] )
在超时毫秒后计划超时编译并运行代码。
答案 1 :(得分:2)
这是预期的行为:您可以传递函数指针或字符串作为第一个参数。
至于它是如何做的,JS是一种脚本语言,因此将字符串评估为某些解释代码(如eval确实)是它非常擅长的。
编辑:我的意思是'非常擅长'它是一种脚本语言,用于将字符串解析为工作代码,正如Jimbo Jonny指出的那样;这是值得避免的事情。
答案 2 :(得分:1)
基本上规范允许它采用任何一种方式,因此浏览器可以采用任何一种方式。那很简单。
不推荐,因为它在字符串上使用eval
。功能方式是更好的方式。