2010-01-09 68 views
0

我不知道爲什麼,但這段代碼不工作?爲什麼不呢?我想這是因爲我在這裏有範圍問題:SetTimeOut的範圍問題

function washAway(obj) { 
    alert($(obj)); // says HTML Object which is fine 
    setTimeout(function() { 
     alert($(obj)); // says undefined 
     $(obj).fadeOut("slow", function() {    
      $(this).remove(); 
     }); 
    }, 2000); 
}; 
+0

它的工作對我來說.. – Nakul 2010-01-09 09:46:32

+0

@Nakul:因爲你的'obj'是全球性的,在此期間不會改變,與Aaron的相反。 – Tomalak 2010-01-09 09:52:07

回答

3

在超時函數執行的地方,它無法知道obj是什麼 - 它是一個傳入設置超時的方法的參數,但裏面的函數沒有引用它。

另一種方法是寫一個jQuery插件,等待它的作用就像在這之前:

function($){ //to protect $ from noConflict() 
    $.fn.pause = function(duration) { 
     $(this).animate({ dummy: 1 }, duration); 
     return this; 
    }; 
} 

然後你可以使用:

$(obj).pause(2000).fadeOut("slow", function() { $(this).remove(); }); 
+0

是的,你也是對的。感謝您的示例代碼btw。 – Tarik 2010-01-09 09:55:50

1

任何方式,我找到了我的答案後,幾次嘗試/錯誤。但我仍然想知道爲什麼它沒有解決。

下面是代碼:

function washAway(obj) { 
    alert($(obj).attr("id")); 
    var a = function() { 
     var _obj = obj; 
     return function() { 
      $(_obj).fadeOut("slow", function() { 
       $(this).remove(); 
      }); 
     }; 
    }; 

    setTimeout(a(), 2000); 
}; 

編輯:我想我理解這裏的問題:

因爲我們在這裏所說的關閉,當washAway執行完畢,該變量OBJ被銷燬所以setTimeOut函數回調函數不能使用該資源,因爲它在堆棧上不再可用,並且它也不是全局變量。