这会创建一个闭包

时间:2012-11-14 00:54:32

标签: javascript closures

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

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仍被引用,关闭。

这是真的吗?

1 个答案:

答案 0 :(得分:4)

从技术上讲, ECMAscript中的每个函数在调用时都会创建一个闭包。它只是词法范围的工作方式。在没有详细介绍的情况下,用作点击事件的事件处理程序的匿名函数将关闭其父上下文。其中一个是匿名函数,它被分配给 initEvent

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

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

这就是范围链的样子。