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);
}

ただし、私のアプリケーションではよく混乱します。私のアプリケーションは 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(...);
        });
    }
}

メソッド内で、 context を参照するinitEvent名前の変数を作成し、それをコールバック関数で呼び出します。thatthis

これは閉鎖を作成しますか?

addListener関数が戻ったとき、変数thatはまだ参照されており、閉じられているため、そう思います。

これは本当ですか?

4

1 に答える 1

4

技術的に言えば、ECMAscriptのすべての関数は呼び出されるとクロージャを作成します。レキシカルスコープが機能するのと同じ方法です。詳しくは説明しませんが、クリック イベントのイベント ハンドラーとして機能する無名関数は、その親コン​​テキストを閉じます。それらの 1 つは、initEventに割り当てられる無名関数です。

そうです、内部関数はクロージャーを作成するため、thatそのライフサイクル中にアクセスできます。

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

これが、スコープ チェーンがどのように見えるかです。

于 2012-11-14T00:58:59.233 に答える