Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 哪种方法更好,setInterval()还是window.setInterval()?_Javascript - Fatal编程技术网

Javascript 哪种方法更好,setInterval()还是window.setInterval()?

Javascript 哪种方法更好,setInterval()还是window.setInterval()?,javascript,Javascript,好的,这个问题有两件事 首先,我要问setTimeout()和setInterval()的问题 我见过几种不同的方式给他们打电话,我想知道哪种方式最适合这种情况 我正在制作一个js/canvas游戏,我只是查看我的绘制间隔(在这里循环绘制方法) 不管怎样,这里是我所看到的不同的方式 A部分: 使用窗口 drawInterval = window.setInterval(draw, 60); drawInterval = setInterval(draw, 60); 不使用窗口 drawIn

好的,这个问题有两件事

首先,我要问setTimeout()和setInterval()的问题

我见过几种不同的方式给他们打电话,我想知道哪种方式最适合这种情况

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

不管怎样,这里是我所看到的不同的方式

A部分:

  • 使用窗口

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

    drawInterval = window.setInterval(draw, 60);
    
    drawInterval = setInterval(draw, 60);
    
  • B部分:

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

    drawInterval = setInterval(draw, 60);
    
    drawInterval = setInterval("draw()", 60);
    
  • 在函数名周围使用引号和括号

    drawInterval = setInterval(draw, 60);
    
    drawInterval = setInterval("draw()", 60);
    
  • 所以对于第A部分:我应该使用窗口吗。还是不? 那么window.clearInterval()和clearInterval本身又如何呢


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

    窗口上不确定。setInterval
    与刚才的
    setInterval

    但是,最好始终将函数传递给setInterval和setTimeout,而不要将字符串传递给setInterval和setTimeout。setInterval()和
    setInterval()
    完全相同-
    窗口部分是隐式的,可以省略


    setTimeout和setInterval都将计算字符串,但最佳做法是发送对函数的引用,因此不使用引号。

    至于使用
    窗口作为前缀。
    ,没有任何区别。你可以用任何一种

  • 除非您声明了自己的本地作用域
    setInterval
    函数,否则
    setInterval
    window.setInterval
    之间没有区别

  • 第二种形式使用隐含的
    eval()
    。在可能的情况下应避免这种情况,因为它可能会导致代码注入


  • A部分中的调用是相同的(除非您在某个地方重新声明其中一个函数)。归根结底,这取决于偏好——我更喜欢关闭
    窗口,因为它是不必要的

    对于B部分,方案1肯定是更好的做法。选项2将使用
    eval
    该字符串,并且几乎应始终避免使用
    eval

  • 窗口是最常用的。是否显式使用它是风格的问题,但作为Python开发人员,我认为显式更好

  • 如果使用引号,setInterval()实质上是“evals”语句。不要使用引号


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

    /*global window */
    

    因此,允许访问所有的
    窗口
    方法,而不必在
    jshint
    指令中单独指定它们。

    好的,那么clearInterval()呢,我必须使用window.clearInterval()吗?我想不…@Jake-你的假设是正确的。相同的“除非您声明了本地范围的版本”语句适用于
    窗口的所有成员。setInterval、setTimeout、clearInterval、clearTimeout等等。嗯,
    window.setInterval()
    不是更快吗?因为JS引擎在到达窗口作用域之前必须先查看所有其他作用域/记住一段关于这个问题的谷歌老视频。/@Jake-没错,是的。如果在函数中声明自己的名为localStorage的变量,将检索其值。如果您没有重新声明它,解释器将查找“范围链”,直到它到达顶级范围(窗口)并找到它需要的内容。这里有一篇文章对此进行了进一步的讨论:我是否可以添加第二个原因来避免调用
    eval()
    ,因为它会导致巨大的性能影响(在渲染循环代码中特别重要)。@Jake,是的,正如其他人
    window所提到的。setInterval
    setInterval
    实际上是一样的,
    window.setInterval
    更为明确。