Пользовательский отложенный обратный вызов jQuery - PullRequest
0 голосов
/ 22 июля 2010

Я играю с расширением jQuery с помощью функции, имеющей два параметра: функцию обратного вызова и тайм-аут. Я на pre 1.4, поэтому у меня нет встроенного .delay (), но даже это не совсем то, что я хочу.

Я начал с нижеприведенного, но неясно,

1, почему функция обратного вызова не определена внутри setTimeout, и

2, как следует Я звоню, если возможно?

$.extend({
  delay: function(callback, msec) {

    alert(callback);     // as expected
    alert(msec);         // as expected

    if(typeof callback == 'function'){

      setTimeout("callback()", msec); // why callback() undefined here?!

    }

  }

});

//Usage:
$.delay(function(){
  alert("this is delayed 5sec");
}, 5000);

Ответы [ 2 ]

2 голосов
/ 22 июля 2010

@ Джейсон уже сказал, как правильно вызывать обратный вызов.

Почему функция обратного вызова не определена внутри setTimeout?

Когда оценивается "callback()",Функция, в которой вы вызвали setTimeout (delay), завершена.Строка оценивается в глобальной области видимости, где функция callback не существует (и я думаю, что всегда будет оцениваться в глобальной области видимости).

Пример:

function a() {
    alert('a');
}

(function() {
    function a() {
        alert('b');
    }
    setTimeout('a()', 1000);
})();

предупредит a.


Принимая во внимание, что если вы создадите замыкание и оцените a() внутри анонимной функции, оно выдаст предупреждение b:

function a() {
    alert('a');
}

(function() {
    function a() {
        alert('b');
    }
    setTimeout(function() {eval('a()');}, 1000);
})();
2 голосов
/ 22 июля 2010

обратный вызов не определен, потому что вы передаете его как строку.сделать это:

setTimeout(callback, msec);
...