Почему setInterval не выполняет функцию, определенную перед ней? - PullRequest
1 голос
/ 31 марта 2011

Почему следующий JavaScript не работает должным образом?

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

Ответы [ 6 ]

5 голосов
/ 31 марта 2011

смените свой код!

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

, который должен работать ^ _ ^

fiddle: http://jsfiddle.net/maniator/hmRpS/

1 голос
/ 31 марта 2011

Причина, по которой оригинальный код не работает, заключается в том, что, поскольку вы передаете строку в setInterval, она должна выполнить eval () для выполнения кода.Однако к тому времени, когда setInterval готов вызвать код, функция вышла из области видимости (поскольку она определена только в обработчике события ready), и ничего не происходит.

1 голос
/ 31 марта 2011

Поскольку функция является локальной для функции ready.

Сделайте его глобальным, и он будет работать:

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

$(document).ready(function(){
  setInterval(function() {
      sayHello();
   }, 1000);
});
1 голос
/ 31 марта 2011

Мой первый взгляд такой:

setInterval(sayHello, 1000);
1 голос
/ 31 марта 2011
setInterval(sayHello, 1000);  .
0 голосов
/ 31 марта 2011

Краткое объяснение.

setInterval( STRING , NUMBER ) использует eval для интерпретации строки, и это eval выполняется в глобальной области видимости, а не в области действия функции, поскольку характер тайм-аута делает его выпадающим из любой области функции.

sayHello находится внутри функции и как таковая не присутствует в глобальной области видимости.

То есть setInterval( STRING , NUMBER ) выдаст ошибку отсутствующего объекта в данном примере.

setInterval( FUNCTION , NUMBER ) гарантирует, что тайм-аут использует ссылку / указатель и избегает необходимости делать глобальные eval.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...