我知道这是经典的封闭方式:
var dvs = document.getElementByTagName("div");
for (var i = 0, len = dvs.length; i < len; i++) {
dvs.onclick = (function(i_) {
return function() {
alert(i_);
};
})(i);
}
但是,在我的应用程序中,我经常感到困惑,我的应用程序基于Google地图。
var app = function() {}
app.prototype = {
init: function() {
this.map = ..;
this.infowindow = ..;
},
initEvent: function() {
var that = this;
google.maps.event.addListener(map, 'click', function() {
that.infowindow.open(...);
});
}
}
在initEvent
方法的内部,我创建了一个名为that
的变量来引用上下文this
,然后在回调函数中调用它。
这会创建一个闭包吗?
我是这么认为的,因为当函数addListener
返回时,变量that
仍被引用,关闭。
这是真的吗?
答案 0 :(得分:4)
从技术上讲, ECMAscript中的每个函数在调用时都会创建一个闭包。它只是词法范围的工作方式。在没有详细介绍的情况下,用作点击事件的事件处理程序的匿名函数将关闭其父上下文。其中一个是匿名函数,它被分配给 initEvent 。
所以,是的,内部函数创建了一个闭包,因此在其生命周期中可以访问that
。
Global Context <> initEvent <> click-event-handler
这就是范围链的样子。