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