0
 var a=1;   //first one
 function x() {
    var a=2;  // second
    function y() {
       var a=3;  // third one
    }
 }

2番目function y()にアクセスできる方法はありますか? 経由で最初のものにアクセスできることはわかっています。 var awindow.a

4

1 に答える 1

2

書かれた通り?いいえ。

それぞれに名前を付けることに固執していない場合はa、簡単に参照できます。他の解決策は、別の変数内で外部変数をキャプチャすることです。トリックは、内部スコープから外部スコープで参照されている同じ変数名を持たないようにすることです。

window.a = 1;
function x() {
    var a = 2,
        inner_a = a,

        y = function () {
            var old_a = inner_a,
            // a is equal to the closest var assignment ie: inside x()
                a = 3;
        };
 }

または、クロージャーを介して新しい関数の構築にそれを渡す
(関数をすぐに呼び出す)

window.a = 1;
function x() {
    var a = 2;
    var y = (function (old_a) {
        return function () { var a = 3; }; 
        // this inner function has access to "old_a", through closure
    }(a));
}

これは、JS とブラウザー機能 (つまり、DOM および DOM イベント、タイマーまたはコールバックを割り当てるループ、AJAX 応答など) を組み合わせる場合に、いくつかのユースケースで好まれるパターンです。

于 2012-08-05T13:17:25.157 に答える