ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScriptでのvar宣言方法と変数スコープの例を詳しく解説

JavaScriptでのvar宣言方法と変数スコープの例を詳しく解説

伊谢尔伦
伊谢尔伦オリジナル
2017-07-18 10:06:211494ブラウズ

現在のコンテキストでこの「暗黙的」宣言を行うと、JavaScript エンジンはまず現在のコンテキストを調べて、この変数が以前に宣言されているかどうかを確認し、宣言されていない場合は、前のコンテキストに移動して検索します。はまだ宣言されていません。見つかった場合、この変数は最終的にウィンドウ上で宣言されます。

window. y = "hello"; 
function func(){ 
y = "OH, NO!!!"; 
} 
func(); 
alert(window.y); //#=> display "OH, NO!!!"

コンテキスト内のいずれかのレイヤーにそのような「暗黙的に」定義された変数がある場合、そのレイヤー内の変数は、ウィンドウ上に新しい変数を生成せずに変更されます。

var x = "window.x"; 
function a() { 
var x = "a's x"; 
var b = function() { 
var c = function() { 
//no var! 
x = "c's x:"; 
}; 
alert("before c run,the b.x:" + x); 
c(); 
alert("after c run, the b.x:" + x); 
}; 
alert("a.x is:" + x); 
b(); 
alert("after b function runed, the a.x is:" + x); 
}; 
alert("before a run, window.x:" + x); 
a(); 
alert("after a run, window.x:" + x);

質問によって引き起こされた考え

1. 迷信!コードの一部によって引き起こされる疑念

for(var i=0;i<3;i++) { 
console.log(j+","+k); 
for(var j=0;j<3;j++) { 
var k = j+1; 
} 
} 
console.log(i);

出力結果:


undefined,undefined 
3,3 
3,3 
3

C、Java、その他の言語で作業している場合、なぜ j や k などのローカル変数が外部のコードからアクセスできるのか混乱するかもしれません。範囲は?

JavaScriptでvarで宣言した変数をローカル変数とみなせる場合、その変数にアクセスできるスコープは変数のローカルスコープとなります。上の例のように、console.log 行には j と k のスコープがまだあり、ループの外側には i のスコープがまだあります。現時点では、JavaScript には実際のローカル スコープがないと勝手に言​​えるかもしれません。本当に?いいえ!


2. 実際のローカルスコープを取得するにはどうすればよいですか?ある書き方が気になりました
皆さんはJQueryのソースコードやExtのソースコードを見たことがあるかもしれませんし、次のような書き方に精通しているかもしれません。

var a = 3,b=4; 
var exports = (function() { 
var a = 1,b=2; 
return {a:a,b:b}; 
})(); 
console.log(""+a+","+b); 
console.log(exports.a+","+exports.b);

出力結果:


3,4 
1,2

関数内に独立したスコープがあること、つまり、関数内で var で宣言された変数は関数内でのみ使用できることがわかります (実際には驚くべきことではありません。誰もが知っています)。関数。したがって、各フレームワークのすべてのマスターは、ローカル変数と外部変数 (外部ローカル変数とグローバル変数) の間の競合を防ぐためにこの方法を記述します。

この時点で、最初の記事の恣意的な推論を撤回し、それを修正します。
JavaScript は関数によって制限されており、各関数は他のブロック (通常のコード ブロック、for ループ、if、while などを含む) をローカル スコープに持ちます。 .) コード ブロック) はローカル スコープを持たず、var を使用して宣言された変数はこれらのコード ブロックを直接通過でき、外部コードからアクセスできます。


3. エラーはどのような場合に報告され、どのような場合に未定義になりますか? var 宣言メカニズム
コードを見てください:

console.log(a)
ReferenceError: a is not defined
undefined
var exports = (function() { 
var a = 1,b=2; 
return {a:a,b:b}; 
})(); 
console.log(a);

出力結果:


ReferenceError: a is not defined

推測結論:

JavaScript エンジンがコードを実行するたびに、まずスコープ内のすべてのコード (関数内のコード) がスキャンされます。コードが実行されて割り当てられる前は、これらの変数の値は未定義です。その後、変数にアクセスする場合は、まずローカル変数にアクセスします。そのようなローカル変数が存在しない場合は、上位レベルのローカル変数 (クロージャなど) にアクセスし、上位レベルがその環境を作成します。クロージャ)、完全なグローバル変数にアクセスするまで。そのような変数がない場合は、例外がスローされます。



以上がJavaScriptでのvar宣言方法と変数スコープの例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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