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

在javascript setTimeout中将字符串作为函数运行?,javascript,string,settimeout,Javascript,String,Settimeout,为什么这个代码可以工作 setTimeout(“document.body.innerHTML='TEST',1000)引用MDN 备用语法中的代码是要在延迟毫秒后执行的代码字符串(由于与使用eval()相同的原因,不建议使用此语法) 正如MDN中所建议的,最好避免在setTimeout中使用字符串,因为实现可能eval传递的字符串 这不仅仅是一个浏览器实现,HTML规范本身也是这样定义的 将超时时间安排为在超时毫秒后编译并运行代码 基本上,规范允许它走任何一条路,所以浏览器会走任何一条路。

为什么这个代码可以工作

setTimeout(“document.body.innerHTML='TEST',1000)
引用MDN

备用语法中的代码是要在延迟毫秒后执行的代码字符串(由于与使用
eval()
相同的原因,不建议使用此语法)

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


这不仅仅是一个浏览器实现,HTML规范本身也是这样定义的

将超时时间安排为在超时毫秒后编译并运行代码


基本上,规范允许它走任何一条路,所以浏览器会走任何一条路。那很简单

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

文档 ,

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

至于它是如何做到这一点的,JS是一种脚本语言,因此将字符串计算为一些解释代码(如eval)是它非常擅长的


编辑:正如Jimbo Jonny所指出的,我的意思是“非常擅长”,因为它是一种脚本语言,用于将字符串解析为工作代码;这是需要避免的。

From:“备用语法中的代码是您希望在延迟毫秒后执行的代码字符串(由于与使用
eval()
相同的原因,不建议使用此语法)。”这是一个有趣的相关观点。实际上,将字符串求值到代码中会迫使它放弃一系列有益的优化,这不仅会减慢该行的速度,还会减慢代码中的许多其他操作。这不是它擅长的事情。事实上,它在这方面做得很差,应该尽可能避免。
handle = window . setTimeout( code [, timeout ] )