window.setInterval('string;',1);

时间:2014-02-25 12:25:59

标签: javascript

我见过以下工作! setinterval call。

window.setInterval('checkhash();', 1);

知道为什么会这样吗?

正常情况是这样的:

setInterval(function(){
      do something
},1000);


function checkhash(){ };

3 个答案:

答案 0 :(得分:6)

您有几种选择:

1)交出一个字符串然后进行评估(不好 - 永远不要这样做!)

window.setInterval('checkhash()', 4);

这基本上对像eval('checkhash()')这样的字符串进行评估。

重要的是要知道,它是在全局上下文中进行评估的,因此以下将失败

(function(){
    function test(){alert("foo")};
    function test2(){alert("bar")};

    // will fail
    setTimeout("test()",1000);


    // will work
    setTimeout(test2,1000);

})();

第一个超时将产生Uncaught ReferenceError: test is not defined,因为test()仅在您的匿名函数的上下文中已知,但在全局空间中不知道:
See example

2)交出功能参考(首选方式)

window.setInterval(checkhash, 4);

3)移交一个匿名函数(当你需要交出参数时使用)

setInterval(function(){
      checkhash(param1,param2);
},4);

也可以执行以下操作(常见的初学者错误):

window.setInterval(checkhash(), 4);

这将立即调用函数并将返回值移交给指定时间后执行的超时。

重要说明:

  • 执行是异步的 - javscript引擎将继续执行其余的js代码。
  • 根据规范,最小超时为4 ms,因此基本上0-3将为您提供至少4ms的间隔(当然,取决于调度程序)。
  • 您无法保证超时会在恰好的时间内触发。在一些非常罕见的情况下甚至可能完全丢弃它。

非常好的阅读是John Resig's article about timers

MDN setTimeout documentation

答案 1 :(得分:0)

这应该是,

window.setInterval(checkhash, 1);

删除你的引号,并按照这样做。

答案 2 :(得分:0)

这是所有JavaScript eval情况之一,这不是一个好习惯,如果你使用string作为第一个参数,它会自动转换为这样的匿名函数:

Function('checkhash();')

那么为什么不将第一个参数作为一个函数传递,这是另一个选择,也是更合理的一个。

window.setInterval(function(){
    checkhash();
}, 1);

或简单地说:

window.setInterval(checkhash, 1);

这种方式唯一的问题是有时您需要使用JavaScript closures来保证变量值的稳定。