【问题标题】:Javascript do while, setTimeout, event variable scope [duplicate]Javascript做while,setTimeout,事件变量范围[重复]
【发布时间】:2018-02-14 06:33:02
【问题描述】:

我有以下代码:

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); 

但我仍然不知道为什么作为事件侦听器闭包的一部分,设置超时匿名函数无法使用目标。

对于对闭包如何工作的误解表示歉意。

【问题讨论】:

  • 变量范围内。但是当您访问它时,您已经对其进行了迭代,直到它成为null

标签: javascript functional-programming scope closures dom-events


【解决方案1】:

您的变量在回调中可用。

但是,当回调运行时,变量为空(因为while 循环已完成)。

【讨论】:

  • 我的印象是,在闭包中,变量被复制到内存中的一个特殊位置,并在创建闭包时保留了状态。 setTimeout 回调是否不会创建与事件侦听器回调分开的自己的闭包?对不起,如果我误解了这个概念。
  • @LorenShqipognja:不;闭包关闭原始变量,并始终反映其当前值。没有副本。
  • target 变量本身已关闭。它在创建函数时的值不是。
猜你喜欢
  • 2010-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 2014-03-28
相关资源
最近更新 更多