【问题标题】:setTimeout() with string or (anonymous) function reference? speedwise [closed]带有字符串或(匿名)函数引用的 setTimeout()?快速[关闭]
【发布时间】:2010-12-22 04:07:09
【问题描述】:

这两种方式中哪一种更快?为什么?

window.setTimeout("func()", 100);

或者

window.setTimeout(function(){func();}, 100);

我猜第二种方法更快,如果除了 John Resig 和所有忍者使用它之外没有其他原因,我猜是因为它已经被解析,而不是第一种方法它必须创建一个新的解析“东西”。我隐约记得这是人们不喜欢 eval() 的原因之一。

另外,虽然我在这里,但在第二个代码片段中,在这种情况下,第一个分号是否被认为是好的做法?

【问题讨论】:

    标签: javascript performance coding-style


    【解决方案1】:

    还有第三个更快/更简单的选项:

    window.setTimeout(func, 100);
    

    ...与您的问题严格相关,第二个更快,因为它仍然是参考 - 而不是评估,这总是相当昂贵。至于分号,是的,始终使用它们是一个好习惯。在我看来,它们永远不应该是可选的,但在这里很多人会不同意我的看法。你真的不能反对在你的代码中明确表达,这总是一件的事情。

    【讨论】:

    • 第三个选项只有在没有参数的情况下
    • @qwertymk - 这是正确的,但您的示例中没有(并且大多数您在野外看到它的时候,也没有)。
    • 实际上你可以使用 setTimeout(func, 100, arg1, arg2, ...) 如果你愿意,但在这种情况下,我的选择是字符串在可读性方面胜出: setTimeout("func (arg1, arg2, ...)", 100)。
    • @qwerymk, @martona,带有额外参数的语法不适用于 IE。
    • 分号问题最近又来了,可以说下面的作者确实不同意@Nick:blog.izs.me/post/2353458699/…
    【解决方案2】:

    正如您所写,两者都同样“安全”。当您尝试传递参数时会出现安全问题,因为您很容易做这样的事情:

    setTimeout('func('+arg+')', 100);
    

    这有可能进行代码注入。有人用它来摧毁你的死星。迟早,一个年轻的绝地武士会想办法让你的应用程序让arg 等于3.14); deathStar.selfDestruct(,接下来你会接到皇帝的电话来解释你的错误。

    而且可能不是你犯了错误……你永远不会做如此愚蠢的事情。当你的代码在 6 个月后被实习生重构并且他们需要添加一个参数时,问题就来了。

    所以字符串形式只是被认为是不好的做法。它速度较慢,而且可能不太安全。

    【讨论】:

    • 最好这样做:setTimeout("func", 100, arg);
    【解决方案3】:

    在内部使用带有字符串语法的 'setTimeout' 会使 javascript 引擎对其进行“评估”。每当浏览器在代码中的任何地方遇到“eval”时,它就无法进行许多优化(因此禁用它们),因为任何东西都可以进入 eval。

    缓存变量等优化无法通过代码中存在的“eval”进行,因为“eval”可能会引入新变量,这些变量将在 Javascript 的编译阶段(检测所有声明)被忽略。

    第二种语法更快,因为它只会在延迟后调用函数,而您不会陷入 'eval' 的弊端。

    【讨论】:

      【解决方案4】:

      你提到的人使用它可能不是因为它更快。

      • 替代语法中的代码是要在延迟毫秒后执行的代码字符串。 (不推荐使用这种语法,原因与使用 eval() 相同)

      来自https://developer.mozilla.org/en/DOM/window.setTimeout

      【讨论】:

        【解决方案5】:

        我不认为任何一个在现代浏览器中都快得多。即使速度稍微快一些,您的代码不会过于频繁地调用 setTimeout 这一事实也使这一点变得毫无意义。

        第一个的好处是可读性更高,是我的首选。

        【讨论】:

        • 该字符串可能更易读,但它更不安全。
        • 嗯...如果您要通过 prompt() 让用户调用函数或对函数名称发出 HTTP 请求来使您的 UI 工作,那么是的,它是不安全。
        猜你喜欢
        • 2019-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多