最初の黄金律:
JSには、ブロックレベルのスコープ(閉鎖やその他の方法で自分で実装できます)はなく、関数レベルの範囲のみです。関数の外側の変数は関数にありますが、関数内の変数は外部には見られません。
FirstTry:
なぜこれがなぜですか? ?
var a = 10; function aaa(){// step-4alert(a); // step-5->アラートを実行すると、外側a = 10} function bbb(){// step-2var a = 20; aaa(); // step-3} //実際、誰もが原則を理解しており、簡単な間違いの問題であるべきであり、すべてが変わるはずです。
第二の:
なぜこれがなぜですか? AがBに割り当てられている場合、Bはまだ定義されていないため、Aは未定義であり、Bは10です。
ゴールデンコードの第2条:
変数の検索は、近接の原理です。 VARによって定義された変数を見つけるには、それらが近くに見つからないときに、外側の層を検索します。
見て:
なぜこれがなぜですか?これには2つの理由があります。1つは分析前であり、もう1つは近くで検索しています。
var a = 10; function aaa(){alert(a); // undefined。 Aを検索するときは、関数を調べます。事前装置の効果により、Aは現時点では未定義であるため、外部10 var a = 20;/*事前装置var aalert(a); var a = 20;*/} aaa();注意:
2番目の項目を確認しましょう。それは近接の原則ですが、近くのvarが宣言された変数を見つけることです。これは、VARによって宣言された変数がグローバルであるためです。ここでは、Aの値が変更されたばかりです。したがって、上記は、VARのAが関数に見られないため、外に出て、検索するとすぐに見つけたので、10をアウトしました。しかし、真実は、a = 20の後、Aは確かに20ですが、警告されたときはまだ実行されていません~~
〜を参照してください
次の例では、JSの関数範囲をさらに検証します。
これは、アラート(a)の場合、BBB関数のaは実際に20であるが、現時点では文アラート(a)にローカルであるためです。アラート(a)BBB関数にAが見つからないため、AAA関数にAを見つけることができないため、外に出て10が見つかります。
ゴールデンコードの第3条:
パラメーターがローカル変数で複製される場合、優先度は同等です。
例:
また、パラメーターを渡すとき、基本型は値を通過し、参照タイプは参照を渡します。 (しかし、再割り当て後はそうではありません)
var a = 5; var b = a; b += 3; alert(a); // 5var a = [1,2,3]; var b = a; b.push(4); alert(a); // [1,2,3,4];
上記のコードに問題はありませんが、以下は異なります。
Bは再割り当てされるため、Aを指しません。
さらに、パラメーターと変数の範囲は類似しています。
これら2つを比較してください:
上記のパラメーターは基本タイプであり、値のみが渡されます。次のものは参照タイプです。(また、再割り当ての場合も含まれます)