現在のコンテキストでこの「暗黙的」宣言を行うと、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
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
この時点で、最初の記事の恣意的な推論を撤回し、それを修正します。
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 サイトの他の関連記事を参照してください。