[はじめに] JavaScript のスコープは関数によって制限されており、異なる関数は比較的独立したスコープを持っています。グローバル変数は関数内で宣言してアクセスできます。また、ローカル変数も宣言できます (var キーワードを使用すると、関数のパラメーターもローカル変数になります)。ただし、内部ローカル変数は関数の外部からアクセスできません:
同じ名前のローカル変数はグローバル変数を上書きしますが、本質的にこれらは 2 つの独立した変数であり、一方を変更しても他方には影響しません:
a = 5; // 関数の外側の a の値は 5
function; test() {
var a = 4; // 関数内の a の値は 4
}();a = ? // 関数外の a の値は 5 のままで、関数の影響を受けません 一般的に、関数が終了すると、関数の内部変数への参照はすべて終了し、関数内のローカル変数はリサイクルされ、関数の実行環境はクリアされます。ただし、内部関数がそのまま使用されている場合は、関数の戻り結果によって状況は変わります: function test(i) {
var b = i * i;
return function() {return b--;
};
}
var a = test (8);
a(); //戻り値は64、内部変数bは63a(); //戻り値は63、内部変数bは62
が戻り値として使用されます。これは、関数の終了後に内部変数への参照が終了しないため、関数のローカル変数は再利用できず、関数の実行環境が保持されるため、クロージャ効果が形成されます。リサイクルする必要がある内部変数には、この参照を通じてアクセスできます。 Closure は関数のローカル変数も「プライベート」変数にし、返された内部関数を通じてのみアクセスでき、他の手段では変更できません。
したがって、クロージャを使用してローカル変数と保護された変数を維持できます。
クロージャのない状況:
var a = []; // a に 5 つの要素が含まれているとします
for (var i = 0, m = a.length; i
return 'No. ' + i;
};}
// 任意の要素をクリックすると、i の最終値が 5 なので戻り値は「No. 5」になります
を使用した場合クロージャ:
function test(i) {return function(e) {
return 'No. ' + i;
};
}
var a = [] // a には 5 つの要素が含まれていると仮定します
for (var i) = 0, m = a.length; m = i++) {a[i].onclick = test(i);
}
// ローカル変数を維持するには、要素をクリックします。 No. 0 ~ No. 4
クロージャーは利便性をもたらす一方で、いくつかの欠点ももたらします:
1. プログラムが複雑になり、理解が難しくなります
2. 複雑なクロージャーはメモリの劣化を引き起こす可能性もあります。リサイクルに失敗してクラッシュします
3. 巨大なクロージャにはパフォーマンスの問題が伴うことがよくあります
したがって、クロージャは大規模で複雑ではなく、合理化され、小規模である必要があり、クロージャの大規模な使用は避けるべきです。クロージャの出現自体が言語のバグですが、その独自の機能により依然としてバグが残っています。それは補助的な手段であり、主な機能ではありません。
以上がJavaScriptのスコープとクロージャの解析と解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。