2010-07-21 119 views
0

我正在玩一個帶有兩個參數的函數來擴展jQuery:一個回調函數和一個超時。我在1.4之前,所以我沒有內置的.delay(),但即使這不是我想要的。自定義jQuery延遲迴調

我已經開始了下面的,但我不清楚的

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

回調未定義,因爲您將它作爲字符串傳遞。這樣做:

setTimeout(callback, msec); 
2

@Jason已經說過如何正確調用回調。

爲什麼setTimeout中的回調函數undefined?

"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); 
})();