1

我知道这是经典的关闭方式:

var dvs = document.getElementByTagName("div");

for (var i = 0, len = dvs.length; i < len; i++) {
    dvs.onclick = (function(i_) {
        return function() {
            alert(i_);
        };
    })(i);
}

然而,在我的应用程序中我经常感到困惑,我的应用程序是基于谷歌地图的。

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方法内部,我创建了一个名为thatcontext的变量this,然后在回调函数中调用它。

这会创建一个闭包吗?

我是这么认为的,因为当函数addListener返回时,变量that仍然被引用,被关闭。

这是真的?

4

1 回答 1

4

从技术上讲, ECMAscript 中的每个函数在调用时都会创建一个闭包。它只是词法作用域的工作方式。在不深入细节的情况下,用作click 事件的事件处理程序的匿名函数将关闭其父上下文。其中之一是分配给initEvent的匿名函数

所以,是的,内部函数创建了一个闭包,因此可以that在其生命周期内访问。

Global Context <> initEvent <> click-event-handler

这就是作用域链的样子。

于 2012-11-14T00:58:59.233 回答