【问题标题】:Which way is better, setInterval() or window.setInterval()?哪种方式更好,setInterval() 还是 window.setInterval()?
【发布时间】:2013-09-30 16:31:13
【问题描述】:

好的,这个问题有几件事。

首先,我问的是 setTimeout() 和 setInterval()

我见过几种不同的方式来称呼他们,我想知道哪种方式最适合这种情况..

我正在制作一个 js/canvas 游戏,我只是在查看我的绘制间隔(它循环绘制方法的地方)

无论如何,这是我见过的不同方式......

A 部分:

  1. 使用窗口。

    drawInterval = window.setInterval(draw, 60);
    
  2. 不使用窗口。

    drawInterval = setInterval(draw, 60);
    

B 部分:

  1. 不在函数名周围使用引号和括号

    drawInterval = setInterval(draw, 60);
    
  2. 在函数名前后使用引号和括号

    drawInterval = setInterval("draw()", 60);
    

所以对于 A 部分: 我应该使用 window.或不? 那么 window.clearInterval() 与 clearInterval 本身呢?

对于B 部分:,我应该使用引号和括号吗?之前有人告诉我,在这种情况下使用引号和括号是个坏主意。

【问题讨论】:

    标签: javascript


    【解决方案1】:
    1. 除非您声明了自己的本地范围 setInterval 函数,否则 setIntervalwindow.setInterval 之间没有区别。

    2. 第二种形式使用隐含的eval()。应尽可能避免这种情况,因为它存在代码注入的可能性。

    【讨论】:

    • 好的,现在 clearInterval() 怎么样,我必须使用 window.clearInterval() 吗?我假设没有..
    • @Jake - 你的假设是正确的。相同的“除非您声明了本地范围的版本”语句适用于window 的所有成员。 setInterval、setTimeout、clearInterval、clearTimeout 等
    • 嗯,window.setInterval() 不是更快吗?由于 JS 引擎在到达窗口范围之前必须首先查看所有 other 范围? /记住有关该问题的旧 Google 视频。/
    • @Jake - 没错,是的。如果您在函数中声明自己的名为 localStorage 的变量,则将检索其值。如果您没有重新声明它,解释器将查找“范围链”,直到它到达顶级范围(窗口)并找到它需要的内容。这是一篇进一步讨论它的文章:digital-web.com/articles/scope_in_javascript
    • 我是否可以添加第二个理由来避免调用 eval() 导致巨大的性能影响(在渲染循环代码中特别重要)。
    【解决方案2】:
    1. windowglobal object。是否显式使用它是一种风格问题,但作为 Python 开发人员,我认为显式更好。

    2. 如果使用引号,则 setInterval() 本质上是“评估”语句。 That's bad。不要使用引号。

    【讨论】:

      【解决方案3】:

      window.setInterval()setInterval() 完全相同 - window 部分是隐含的,可以省略。

      setTimeout 和 setInterval 都会对字符串进行求值,但最佳做法是发送对函数的引用 - 因此没有引号。

      【讨论】:

        【解决方案4】:

        A 部分中的调用是相同的(除非您在某处重新声明了其中一个函数)。归结为偏好 - 我更愿意放弃 window,因为它是不必要的。

        对于 B 部分,选项 1 绝对是更好的做法。选项 2 将转到 eval 那个字符串,并且几乎总是应该避免使用 eval

        【讨论】:

          【解决方案5】:

          至于以window. 为前缀,没有任何区别。你可以使用任何一个。

          【讨论】:

            【解决方案6】:

            不确定window.setIntervalsetInterval

            但是,最好总是传递一个函数,而不是字符串到 setInterval 和 setTimeout

            【讨论】:

            • @Jake,是的,正如其他人提到的那样,window.setIntervalsetInterval 实际上是相同的,window.setInterval 更明确。
            【解决方案7】:

            使用window.setTimeout 而不仅仅是setTimeout 的另一个很好的理由是,它允许您只向jshint 提供一个声明,您的代码依赖于哪些全局对象:

            /*global window */
            

            因此允许访问所有 window 方法,而无需在 jshint 指令中单独指定每个方法。

            【讨论】:

              猜你喜欢
              • 2016-12-10
              • 1970-01-01
              • 1970-01-01
              • 2016-07-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-11-21
              • 1970-01-01
              相关资源
              最近更新 更多