-1

ここでJSがこのように機能する理由を理解するのを手伝ってもらえますか?

var timer = 3;
var func = function() {
  alert(timer);
  var timer = 5;
}
func();

それは私に「未定義」を返します。

私が行った場合

var timer = 3;
var func = function() {
  alert(timer);
  timer = 5;
}
func();

期待どおりに動作します (アラート 3)。

それは私が正しく理解していなかったスコープを持つものです。JS はアラートの後に「タイマー」の定義を上書きすべきではありませんか?

クロームのみでテスト済み。

君たちありがとう。

4

2 に答える 2

4
var timer = 3;
var func = function() {
  alert(timer);
  var timer = 5;
}

このコードはjsが解釈するとこうなります。

var timer = 3;
var func = function() {
  var timer; // Here local variable timer is undefined
  alert(timer); // here local var timer alerts rather than global var timer 
  timer = 5; // here timer got initialized
}

これは、javascript の巻き上げの概念が原因で発生します。ここから巻き上げを読むことができます

于 2016-03-03T09:53:58.557 に答える
0

変数の巻き上げは、JavaScript の「巻き上げ」(変数宣言の送信) が現在のスコープの先頭に来るという点で煩わしいものです。

ただし、現在のスコープの先頭に初期化を送信しません。

そう:

var timer = 3;
var func = function() {
  alert(timer);
  var timer = 5;
}

になります:

var timer = 3;
var func = function() {
  var timer;
  alert(timer);
  timer = 5;
}

解釈されるとき。

巻き上げは、(多くの開発者にとって) JavaScript の未知の、または見過ごされている動作です。

開発者が巻き上げを理解していない場合、プログラムにバグ (エラー) が含まれている可能性があります。

バグを避けるために、常にすべての変数をすべてのスコープの先頭で宣言してください。

これは JavaScript がコードを解釈する方法であるため、常に適切なルールです。

于 2016-03-03T09:57:13.353 に答える