【发布时间】: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