4

JavaScript はすべての変数宣言を関数の先頭に移動することを知っています。ただし、以下の両方の console.log() で同じ結果を期待していました。ただし、最初のケースでは NaN を取得し、2 番目のケースでは 4 を取得します。

誰かがこれを説明できますか?StackOverflow で既に尋ねられて回答された同様の質問があることは知っていますが、この質問は関数定義に関係しています。例: JavaScript は関数変数を変数宣言の最後に移動しますか?

var doB = function() { return a+1};
var b = a+1;
var a = 3;
console.log(b); // NaN
console.log(doB()); // 4
4

4 に答える 4

5

巻き上げのため、コードは技術的に次のようになります。

var doB, b, a;
doB = function() {
    return a+1;
};
b = a + 1;
a = 3;
console.log(b); // NaN
console.log(doB()); // 4

コードは上から下に実行されるため、 が に初期化されるときba + 1aまだ何も初期化されていません (それはundefinedです)。本当に、bとして設定しようとしますundefined + 1。これはNaN

于 2013-05-04T00:02:26.260 に答える
2

JavaScript スコープ

現時点で知っている最も正確な用語を使用したいと考えていますが、それが完全に正しいわけではないことも承知しています。私はJavaScriptの第一人者ではありませんが、あなたが尋ねているこの問題はJavaScript Scope に関連していますこのトピックに関する多くの記事と、例で見つけたこのようなSO に関する Q&A も見つけることができます

一歩一歩

あなたのスニップネットが何をするかを行ごとに再現しようとします。どこかで間違った用語に気付いた場合はコメントしてください。私はいつでも学ぶのが好きです:D

ライン1

var doB = function() { return a+1};

意味

現在のスコープに「doB」という名前の変数を保存し、その内容を無名関数に割り当てます。

それで...

a今のところ問題ありません。


2行目

var b = a+1;

意味

現在のスコープで指定された変数bを保存し、その内容new Integer(1)を variable に加えてに割り当てますa

それで...

現時点でaundefined、現在のスコープで宣言されておらず、このスコープからアクセスできる他のスコープも宣言されていないためです。演算undefined + aは に等しいNaNa値として割り当てNaNられます。


3行目

var a = 3;

意味

現在のスコープで名前が付けられた変数aを保存し、その内容をnew Integer(3)

それで...

aこれで、整数を格納する変数ができました。


4行目

console.log(b);

実際は でNaNあるため、出力します。bNaN


5行目

console.log( doB() );

意味

引数なしで関数をconsole.log呼び出して返された値をdoB最初の引数として関数を呼び出します。

それで...

doBが呼び出されて返されます: a+1

つまり

new Integer(1)変数に加えてaa関数のローカル スコープには存在しませんが、関数内でアクセス可能なスコープには存在します。値はそこから取得され、実際には3. コンソール出力4

于 2013-05-04T00:40:31.977 に答える
2

変数が巻き上げられると、コードは基本的に次のように動作します。

var doB;
var a;
var b;

doB = function() {
    return a + 1
};

b = a + 1;
a = 3;

console.log(b); // NaN
console.log(doB()); // 4

aを定義するときに が定義されていないため、bbに設定さNaNundefined + 1 === NaNます。

aは関数のスコープ内にあるため、呼び出した時点で、 はaすでに の値を持っています3

于 2013-05-04T00:02:41.150 に答える
0

a1に割り当てているときに追加しようとすると、未定義になりますb

var b = undefined+1; // = NaN
于 2013-05-04T00:01:12.940 に答える