2

重複の可能性:
関数のクロージャーにアクセスすることは可能ですか?

明らかにするモジュール パターンの次の実装があるとします。

var myModule = (function() {
    var myVar,
        _self = this;

    function setMyVar( myVar ) {
        _self.myVar = myVar;
    }

    return {
        setMyVar: setMyVar
    }
})()

myModule.setMyVar('happy');​

私がやりたいことは、モジュール レベル myVar を「幸せ」に設定することです。'this' は匿名の親関数の window と等しいため、これは機能しません。簡単な回避策の 1 つは、子と親の名前の衝突を回避することですが、それはさておき、ネストされた子関数内から無名関数スコープへの参照にアクセスできる方法はありますか?

4

2 に答える 2

3

「簡単な回避策の 1 つは、子と親の名前の衝突を避けることです」

これは回避策ではなく、ベスト プラクティスであると考えてください。変数のシャドウイングは多くの場合、メリットをもたらしませんが、使用している変数を忘れると、コードが混乱したりバグが発生したりする可能性があります。

コードで直接操作できるオブジェクトとして使用できる唯一の変数スコープ(または変数オブジェクト、バインディング オブジェクトなど)は、 「グローバル」スコープです。ネストされたスコープでは、この種の直接アクセスは許可されないため、シャドウ変数を回避する以外に選択肢はありません。

通常、これは問題になりません。関数変数またはパラメーターは、元のスコープ内の変数にのみアクセスできます (したがって、シャドウ) ため、関数を別のスコープに渡しても、そのスコープ内の変数と競合することはありません。

必要に応じて、 http://jshint.comなどのコード バリデーターでシャドウ変数をキャッチできます。

于 2012-09-23T16:43:33.047 に答える
1

いいえ。マスクされている場合は、マスクされており、アクセスできません。

于 2012-09-23T16:21:46.397 に答える