すでにグローバルスコープにいる場合は、違いが非常に小さいため、心配する必要はありません。
2つのfor
ループがあり、それらを使って何かをしたいとします。
。
for (i = 0; i < elements.length; i++) {
element = elements[i];
for (i = 0; i < items.length) {
item = items[i];
element.add(item);
}
}
この擬似コードは、多くの異なる言語で正常に機能します。プログラムは内部ループと外部ループを確認し、それi
が同じものを参照していないことを認識できました。
JavaScriptでは、それらは同じi
です。
これは、他の言語にはブロックスコープがあるためです。新しい中括弧を入力すると、プログラムは変数を新しいものとして扱います。
JavaScriptには関数スコープしかありません。つまり、関数内の変数はnewとして扱われますが、制御ステートメント(、、)内では、if
それらは同じ値を持つ同じ変数です。
したがって、外側のループは0に設定されてから、内側のループに入ります。
内側のループはすべてのアイテムのリストを通過し、それが進むにつれて構築されます...
次に、外側のループに戻り、それでも等しい...
それよりも小さい場合は、に1が追加され、現在はより高くなります。長さよりも大きいので、内側のループでは何も起こりません...
...代わりにより大きい場合、外側のループは1回の通過後に終了します。for
switch
i
i
i
items.length - 1
elements.length
i
items
items.length
elements.length
これで、プログラム全体で、または、または、または、または、または、または、などを数回(数x
万行も)使用したい場合について考え始めることができると確信しています。同じ名前で2つの異なるものを呼び出そうとすると、問題が発生する可能性がある、上記のループのような状況について考え始めることができます。name
value
el
sum
i
default
src
url
img
script
これはvar-fallthroughと同じ問題です
と呼ばれる変数を使用する関数と、x
と呼ばれる別の変数を使用する別の関数がある場合x
、それは素晴らしいことです......変数を宣言するのを忘れない限り。
// no problems!
function func1 () { var x = 0; }
function func2 () { var x = "Bob"; }
// big problems!
function func1 () { x = 0; }
function func2 () { x = "Bob"; }
func1
セットwindow.x = 0;
func2
セットwindow.x = "Bob";
... window.x
42に等しいと想定されていた場合、他のプログラムが正しく機能するためには、いくつかの欠落しているために、3つの壊れたアプリが存在する可能性がありますvar
。
ただし、グローバル変数を即座に設定するわけではありません。それが実際に行うことは、機能チェーンを通過することです。別の関数内に関数を作成すると、宣言されていない変数はその親の変数、次に祖父母の変数、次に曽祖父母の変数を調べます...
それが完全に到達しwindow
、誰もその変数を持っていない場合名前を入力すると、その名前の名前がに作成されwindow
ます。
function func1 () {
var x = 0;
function func2 () {
var y = 1;
x = 2;
z = 3;
}
func2();
}
func1を呼び出すと、それ自体x
が0に設定され、func2が呼び出されます。func2は自身y
を1に設定し、次にfunc1x
を2に設定します。次に、func2にはないz
、func1にはないz
、window
ないためz
、3に設定window.z
します。
これは混乱の始まりに過ぎず、その関数内(およびその関数内で作成された関数)で使用可能である必要がある変数を定義していることを確認するのは非常に良い考えです。 ..そして、既存の変数を参照するときは、それらを注意深く参照し、コード内でその変数がどこにあるべきかを知っています(どの関数がそれを定義したのか... ...チェーンのどこにプログラムが行くのか) )に到達する前に、見るのをやめてwindow
ください。また、別の関数の内部から変更する理由を説明してください。