0

我有以下代碼。Javascript做while,setTimeout,事件變量作用域

document.getElementById("whatever").addEventListener("click", function(e){ 

    var target = e.target; 
    var search = "TR"; 
    do{ 
     if(target.nodeName.toUpperCase() === search) { 
      window.setTimeout(function(){ 
       console.log(target); 
      }); 

    }while(target = target.parentNode); 
}); 

我的印象是,由於可變對象是在window.setTimeout的外範圍,onclick事件偵聽器閉合內部,這將是提供給的setTimeout的範圍,但顯然也就是下不是這樣。爲什麼是這樣?這裏究竟發生了什麼?

我知道我可以做這個通過上下文進入設置超時匿名函數,

window.setTimeout(function(){ 
       console.log(this); 
      }.bind(target); 

但我仍處於虧損狀態,爲什麼目標將無法使用設定的超時匿名函數的一部分的事件監聽器關閉。

在此先感謝您對如何解決關閉工作的誤解所做的回覆和道歉。

+0

範圍中的變量*爲*。但是當你訪問它時,你已經迭代它直到它爲空。 – Bergi

回答

1

您的變量在回調中可用。

但是,在回調運行時,變量爲空(因爲while循環已完成)。

+0

我的印象是,在閉包中,變量被複制到內存中的一個特殊位置,並且在創建閉包時保存該狀態。 setTimeout回調函數是否獨立於事件偵聽器回調創建它自己的閉包?對不起,如果我誤解了這個概念。 –

+2

@LorenShqipognja:不;一個閉包關閉了original_變量,並且總是反映它的當前值。沒有副本。 – SLaks

+0

'target'變量本身被關閉。它在創建函數時的值不是。 – Quentin