jquery 为什么setInterval不执行之前定义的函数?

mfpqipee  于 2022-12-12  发布在  jQuery
关注(0)|答案(6)|浏览(186)

为什么下面的JavaScript不能正常工作?

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

ubof19bj1#

更改您代码!

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

应该可以^_^
小提琴:http://jsfiddle.net/maniator/hmRpS/

olqngx59

olqngx592#

setInterval(sayHello, 1000);  .
p4rjhz4m

p4rjhz4m3#

我的第一眼是这样的:

setInterval(sayHello, 1000);
pdsfdshx

pdsfdshx4#

因为该函数是ready函数的局部函数。
让它全球化,它就会起作用:

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

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

pvcm50d15#

原始代码无法运行的原因是,因为您要向setInterval传递一个字符串,它必须执行eval()才能执行代码。然而,当setInterval准备好调用代码时,函数已经超出了作用域(因为它只在ready事件处理程序中定义),因此什么也没有发生。

htrmnn0y

htrmnn0y6#

简短的深度解释。
setInterval( STRING , NUMBER )使用eval来解释字符串,并且这个eval在全局作用域中执行,而不是在函数作用域中执行,因为超时的性质使它脱离了任何函数作用域。
sayHello驻留在函数内部,因此不存在于全局范围中。
因此,在给定的示例中,setInterval( STRING , NUMBER )将引发缺少对象错误。
setInterval( FUNCTION , NUMBER )确保超时使用引用/指针,并避免需要执行全局eval

相关问题