【问题标题】:Running string as function in javascript setTimeout?在javascript setTimeout中将字符串作为函数运行?
【发布时间】:2016-01-22 18:14:03
【问题描述】:

为什么这段代码有效?

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

不应该吗?

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

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

【问题讨论】:

  • 来自MDN: "替代语法中的代码是一串代码要在延迟毫秒后执行(不建议在与使用eval()) 的原因相同"
  • 一个有趣的相关观点here.

标签: javascript string settimeout


【解决方案1】:

引用 MDN 的 setTimeout documentation

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

按照 MDN 中的建议,最好避免 setTimeout 中的字符串,因为实现可能会通过 eval 传递字符串。


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

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

在 timeout 毫秒后安排一个超时以编译和运行代码

【讨论】:

    【解决方案2】:

    firefox 的文档 , IE

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

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

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

    【讨论】:

    • 实际上,将字符串评估为代码会迫使它放弃一系列有益的优化,不仅会减慢该行,还会减慢代码中的许多其他操作。这不是它擅长的事情。这实际上是它非常不擅长的事情,应该尽可能避免。
    【解决方案3】:

    基本上规范允许它采用任何一种方式,因此浏览器会采用任何一种方式。就这么简单。

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

    【讨论】:

      猜你喜欢
      • 2015-01-02
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多