在javascript setTimeout中将字符串作为函数运行?

时间:2016-01-21 16:17:26

标签: javascript string settimeout

为什么这段代码有效?

setTimeout("document.body.innerHTML = 'TEST'", 1000)

不应该吗?

setTimeout(function() {
    document.body.innerHTML = 'TEST'
}, 1000)

setTimeout如何将字符串转换为函数?

3 个答案:

答案 0 :(得分:6)

引用MDN' setTimeout documentation

  备用语法中的

代码是您希望在延迟毫秒后执行的一串代码(建议不要使用此语法,原因与使用eval()相同)

正如MDN中所建议的那样,最好避免setTimeout中的字符串,因为字符串传递的实现可能eval

这不仅仅是一个浏览器实现的东西,而且HTML规范本身也是这样定义的this section

handle = window . setTimeout( code [, timeout ] )
     

在超时毫秒后计划超时编译并运行代码

答案 1 :(得分:2)

firefox的文档 ,IE

这是预期的行为:您可以传递函数指针或字符串作为第一个参数。

至于它是如何做的,JS是一种脚本语言,因此将字符串评估为某些解释代码(如eval确实)是它非常擅长的。

编辑:我的意思是'非常擅长'它是一种脚本语言,用于将字符串解析为工作代码,正如Jimbo Jonny指出的那样;这是值得避免的事情。

答案 2 :(得分:1)

基本上规范允许它采用任何一种方式,因此浏览器可以采用任何一种方式。那很简单。

不推荐,因为它在字符串上使用eval。功能方式是更好的方式。