4

私はjavascriptを学んでおり、私の質問は実際にはどこでも使用されていないかもしれませんが、インタビューの目的でこれを明確に理解したいと思っています. 以下はコードです。最初のアラートは「未定義」で、2 番目のアラートは「4」です。2番目のものは理解できます。最初のアラートが「5」と未定義のアラートを出さない理由を知りたいですか? 同じの背後にあるコンセプトは何ですか?ありがとう。

 var x = 5;
 function check(){
     alert(x);
     var x = 4;
     alert(x);
  }
 check();
4

2 に答える 2

10

varスコープの先頭に常に巻き上げられます (移動されます)。あなたのコードはこれと同等です:

 var x = 5;
 function check(){
     var x;
     alert(x);
     x = 4;
     alert(x);
  }
 check();

明らかにわかるように、 local にはまだ値がなくても、 localxは globalを非表示にします (そのため、最初のアラートには が表示されます)。xundefined


var少しおまけ: 条件文やその他のブロックは、宣言の巻き上げに影響しません。

var x = 1;
(function() {
  x = 3;
  if (false) {
    var x = 2; // var will be moved to the begining of the function
  }
})()
console.log(x) // 1
于 2013-10-31T17:10:52.653 に答える
1

JavaScript には確かに慣れるのに少し時間がかかる概念がいくつかあります。簡単な質問のように思えることに対する答えが長くなってしまうこともありますが、できるだけ迅速かつ簡潔にしようと思います。

JavaScript では、変数は関数によってスコープされ、変数をスコープできる (コンテキストを持つ) 場所は、「グローバル」または「ローカル」の 2 つです。Web ブラウザーのグローバル コンテキストは「ウィンドウ」であるため、コード例var x = 5;ではグローバル変数です。コード内のローカル コンテキストはチェック関数内にあるためvar x = 4;、チェック関数のローカル変数です。さらに関数がある場合、それらには独自の関数スコープ(コンテキスト)などがあります。関数内で変数を宣言するときに「var」という単語を忘れると、「グローバル」変数になるので注意してください。「グローバル」と「ローカル」のスコープができたので、Javascript プログラムが実行される前に何が起こるのでしょうか?

コードが実行される前に Javascript エンジンでいくつかのことが起こりますが、変数に何が起こるかだけを見ていきます。変数は、その機能コンテキストまたはスコープの一番上に「引き上げられる」と言われます。つまり、変数宣言が「持ち上げられるか、一番上に移動され、値「未定義」が割り当てられますが、初期化されず、初期化は元の場所にとどまります」ということです。この巻き上げにより、定義された関数内のどこでも変数を使用できるようになります。

したがって、次のようになります。

//to be accurate this is hoisted to its functional scope as well
var x;

x = 5;
function check() {
  //declaration of 'x' hoisted to the top of functional scope,
  //and assigned undefined
  var x;
  //this will alert undefined
  alert(x);
  //initialization of variable remains here
  x = 4;
  //so after the initialization of 'x' this will alert 4
  alert(x);
}
check();

ハッピーコーディング!!!

余談ですが、ブロック レベルのスコープを追加するために実装できる「let」という名前の新機能があります。EMCAScript 6 には実装されていると思いますが、現時点ではすべてのブラウザに実装されているわけではないため、脇に置きました。

于 2013-10-31T21:17:24.433 に答える