2011-03-30 89 views
1

为什么不按预期的那样运行以下JavaScript?为什么不执行setInterval执行之前定义的函数?

$(document).ready(function(){ 
    function sayHello(){alert("Hello");} 
    setInterval('sayHello()', 1000); 
}); 
+4

需要明确的是,这部作品在某些情况下,而不是在这一个原因,是因为你定义'sayHello'匿名函数中,当'setInterval'传递一个字符串,它会'eval'该字符串中全球背景下,失去与匿名功能的联系。 – Zikes 2011-03-30 21:03:23

回答

5

更改你的代码!

$(document).ready(function(){ 
    function sayHello(){alert("Hello");} 
    setInterval(sayHello, 1000); 
}); 

应该工作^ _^

小提琴:http://jsfiddle.net/maniator/hmRpS/

+0

种烦人,但它的工作原理^ _ ^谢谢 – Neal 2011-03-30 21:01:31

+0

尼尔!当是必要的括号? – Babiker 2011-03-30 21:01:59

+0

@Babiker当你在函数中有参数^ _ ^时, – Neal 2011-03-30 21:02:42

1
setInterval(sayHello, 1000); . 
1

我乍一看是这样的:

setInterval(sayHello, 1000); 
1

因为函数是本地ready功能。

让它是全局,也将努力:

function sayHello() { 
    alert("Hello"); 
} 

$(document).ready(function(){ 
    setInterval(function() { 
     sayHello(); 
    }, 1000); 
}); 
1

究其原因,原来的代码不工作是因为你传递一个字符串给setInterval,它必须的eval()它来执行代码。但是,在setInterval准备调用代码的时候,函数已经超出了范围(因为它只在ready事件处理程序中定义),所以什么也没有发生。

0

深入解释。

setInterval(STRING , NUMBER)使用eval解释字符串,这是eval在全球范围内,而不是功能的范围内被执行,因为超时的性质使得它拖放任何职能范围。

sayHello驻留在函数中,因此不存在于全局范围中。

Ergo setInterval(STRING , NUMBER)将在给出的示例中抛出丢失的对象错误。

setInterval(FUNCTION , NUMBER)确保超时使用参考/指针并避免需要执行全局性的eval

相关问题