多くの現代言語では変数をできるだけ遅く宣言することが推奨されていますが、JavaScript ではこれは最悪の提案です。ブロックレベルのスコープがないため、関数で使用されるすべての変数を関数本体の先頭で宣言することが最善です。
この種のスコープの利点の 1 つは、内部関数が、それが定義されている外部関数のパラメーターと変数にアクセスできることです (this と argument を除く)。
alert(hello); //エラー: こんにちは、存在しません。主なアイデアは、匿名メソッドを定義してすぐに実行することです。関数の先頭のリテラルは関数定義として解釈されるため、それを囲むように一対の括弧が追加され、その後、一対の括弧を使用して関数が呼び出されることを示します。外部アラートは、関数内で定義された hello にアクセスできません。
トラップ 1: var のトラップ
「グローバル空間の汚染からグローバル変数の速度を低下させる」例は、
var obj = ( function ( ) {
var hello = 'Hello World.';
return {
sayHello: function () {
alert(hello)
}; ();
obj.sayHello();
Trap 2: Closure Trap
(function () { //Function a
var arr = [];
var i = 0;
var j;
for ( ; i < 3; i ) {
arr.push(function () { //Function b
alert(i * 10);
});
}
for (j in arr) {
arr[j]();
}
})();
I thought that after each function in the function array arr is executed, 0 will pop up, 10,20, but it turned out not to be the case. The result is 30,30,30 popping up.
Function b does not access the current value of i, but directly accesses the variable i (used to always take the latest value of i).
The reason is that function b is an internal function of function a, variable i is visible to function b, and function b gets the latest value from i every time.
This time changed to:
( function () { //function a
var arr = [];
var i = 0;
var j;
for ( ; i < 3; i ) {
arr. push((function (anotherI) { //Function m
return function () { //Function b
alert(anotherI * 10);
}
})(i)); // Here is (function b(anotherI) {})(i)
}
for (j in arr) {
arr[j]();
}
})();
After this execution, 0,10,20 finally popped up. Why is this?
Function b accesses anotherI (the value of i at that time) instead of directly accessing variable i.
Every time before arr.push, a new anonymous function m will be defined. In this example, three anonymous functions m0, m1, and m2 are defined. Each time they are called, their otherI gets the value of the current i. Each m function returns a b function after execution. b0 is in m0, b1 is in m1, and b2 is in m2. b0 can only access anotherI of m0 (which is 0), but b0 cannot access anotherI of m1 because m0 and m1 are different functions.