var a=1; //first one
function x() {
var a=2; // second
function y() {
var a=3; // third one
}
}
2番目function y()
にアクセスできる方法はありますか? 経由で最初のものにアクセスできることはわかっています。 var a
window.a
var a=1; //first one
function x() {
var a=2; // second
function y() {
var a=3; // third one
}
}
2番目function y()
にアクセスできる方法はありますか? 経由で最初のものにアクセスできることはわかっています。 var a
window.a
書かれた通り?いいえ。
それぞれに名前を付けることに固執していない場合は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 応答など) を組み合わせる場合に、いくつかのユースケースで好まれるパターンです。