为什么不按预期的那样运行以下JavaScript?为什么不执行setInterval执行之前定义的函数?
$(document).ready(function(){
function sayHello(){alert("Hello");}
setInterval('sayHello()', 1000);
});
为什么不按预期的那样运行以下JavaScript?为什么不执行setInterval执行之前定义的函数?
$(document).ready(function(){
function sayHello(){alert("Hello");}
setInterval('sayHello()', 1000);
});
更改你的代码!
$(document).ready(function(){
function sayHello(){alert("Hello");}
setInterval(sayHello, 1000);
});
应该工作^ _^
setInterval(sayHello, 1000); .
我乍一看是这样的:
setInterval(sayHello, 1000);
因为函数是本地ready
功能。
让它是全局,也将努力:
function sayHello() {
alert("Hello");
}
$(document).ready(function(){
setInterval(function() {
sayHello();
}, 1000);
});
究其原因,原来的代码不工作是因为你传递一个字符串给setInterval,它必须的eval()它来执行代码。但是,在setInterval准备调用代码的时候,函数已经超出了范围(因为它只在ready事件处理程序中定义),所以什么也没有发生。
深入解释。
setInterval(STRING , NUMBER)
使用eval
解释字符串,这是eval
在全球范围内,而不是功能的范围内被执行,因为超时的性质使得它拖放任何职能范围。
sayHello
驻留在函数中,因此不存在于全局范围中。
Ergo setInterval(STRING , NUMBER)
将在给出的示例中抛出丢失的对象错误。
setInterval(FUNCTION , NUMBER)
确保超时使用参考/指针并避免需要执行全局性的eval
。
需要明确的是,这部作品在某些情况下,而不是在这一个原因,是因为你定义'sayHello'匿名函数中,当'setInterval'传递一个字符串,它会'eval'该字符串中全球背景下,失去与匿名功能的联系。 – Zikes 2011-03-30 21:03:23