1

以下のスニペットはまったく同じことを行います。最初の1つ:

var obj_button = {
    clicked: 1,
    click: function() {
        console.log(clicked);
    }
};

二つ目:

var Func_button = function() {
    var clicked = 1;
    this.click = function() {
        console.log(clicked);
    }
}

しかし、クロージャーを利用したい場合、最初のアプローチは失敗します:

func = new Func_button();
func.click(); // OK - works fine, outputs 1
obj_button.click(); // FAIL - he don't know what is "clicked"

だから私の質問は、最初のアプローチで、メソッド click() が「クリックされた」パラメータを表示できない理由です。クロージャーはこのパラメーターをカバーすべきではありませんか (2 番目の例のように) ?

4

1 に答える 1

4

いいえ、clicked最初のインスタンスはオブジェクト スコープにあり、2 番目のインスタンスは関数スコープにあるためです。 this.click = functionも関数スコープ内ですが、 の内容はclick: function () {異なるスコープ内にあります。

最初の例を機能させるには、次を使用できます。

console.log(this.clicked);

2 番目の例を書き直しても、同じ動作を確認できます。

var Func_button = function() {
    this.clicked = 1;
    this.click = function() {
        console.log(clicked);
    };
}

現在、func.clickedは を返します1が、呼び出すfunc.click()と同じエラーが発生します。

于 2013-02-05T15:25:31.593 に答える