Javascript做的时候,setTimeout,事件变量范围

时间:2017-09-05 21:50:12

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

我有以下代码。

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的范围,但显然情况并非如此。为什么是这样?这到底发生了什么?

我知道我可以通过执行此操作将上下文传递给set timeout anonymous函数,

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

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

提前感谢您对关闭工作方式的误解做出回应和道歉。

1 个答案:

答案 0 :(得分:1)

您的变量在回调中可用。

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