ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScriptのスコープを再考_基礎知識

JavaScriptのスコープを再考_基礎知識

WBOY
WBOYオリジナル
2016-05-16 16:35:471141ブラウズ

黄金律 1:

JS にはブロックレベルのスコープがありません (独自のクロージャまたは他のメソッドで実装できます)。関数レベルのスコープのみがあり、関数の外側の変数は関数内で見つけることができますが、関数内の変数は見つけることができません。関数の外で見つかります。

最初の試み:

これはなぜですか? ?

var a = 10;
function aaa(){//step-4
	alert(a);//step-5->执行alert,此时只能找到外面的a=10故弹框10
}
function bbb(){//step-2
	var a = 20;
	aaa();//step-3
}
//定义了函数没啥用,调用才是真格的所以这里是step-1
bbb();//step-1

実際、その原理は誰でも知っていますが、間違いを犯しやすいというだけのはずです。

2 回目の試行:

これはなぜですか? b を a に代入するとき、b は定義されていないため、a は未定義であり、b は 10 です。

黄金律 2:

変数の検索は近接性の原理に基づいて行われます。変数が近くに見つからない場合は、外側の層を検索します。

見てください:

これはなぜですか?これには 2 つの理由があり、1 つは事前分析、もう 1 つは周囲の検索です。

var a=10;
function aaa(){
	alert(a);//undefined,查找a的时候会现在函数内查找,由于预解析的作用,此时的a是undefined,因此永远不会去查找外面的10了
	var a = 20;

	/*预解析
	var a
	alert(a);
	var a = 20;*/

}
aaa();

注意:

これで 2 番目の点が検証されますが、var で宣言された変数は近くにあります。これは、var なしで宣言された変数がグローバルであり、ここでは a の値のみが変更されるためです。つまり、上記は var の a が関数内に見つからなかったため、外に出て探したところすぐに見つかったので、a が 10 にアラートされたのは事実です。 =20、a は確かに 20 です。アラートがまだ実行されていないだけです~~

それでは~

次の例では、js の関数スコープをさらに検証します。

これは、alert(a)の時点では確かにbbb関数のaは20ですが、この時点ではalert(a)の文に対してローカルであり、alert(a)が全く見つからないからです。 bbb 関数に a があったため、aaa 関数に a が見つからなかったので、外を探したところ 10 が見つかりました。

黄金律 3:

パラメータがローカル変数と同じ名前の場合、優先順位は同じです。

例:

また: パラメーターを渡すとき、基本型は値によって渡し、参照型は参照によって渡します。 (ただし、再割り当て後はこの限りではありません)

var a = 5;
var b = a;
b +=3;
alert(a);//5

var a = [1,2,3];
var b=a;
b.push(4);
alert(a);//[1,2,3,4];

上記のコードは問題ありませんが、以下のコードが異なります。

b は再割り当てされ、a を指さなくなったためです。

さらに、パラメータと変数のスコープも同様です:

これら 2 つを比較してください:

上記のパラメータは基本型であり、値のみが渡されます。以下は参照型です: (再代入も含みます)

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。