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
。
それで...
現時点でa
はundefined
、現在のスコープで宣言されておらず、このスコープからアクセスできる他のスコープも宣言されていないためです。演算undefined + a
は に等しいNaN
。a
値として割り当てNaN
られます。
3行目
var a = 3;
意味
現在のスコープで名前が付けられた変数a
を保存し、その内容をnew Integer(3)
それで...
a
これで、整数を格納する変数ができました。
4行目
console.log(b);
実際は でNaN
あるため、出力します。b
NaN
5行目
console.log( doB() );
意味
引数なしで関数をconsole.log
呼び出して返された値をdoB
最初の引数として関数を呼び出します。
それで...
doB
が呼び出されて返されます: a+1
つまり
new Integer(1)
変数に加えてa
。a
関数のローカル スコープには存在しませんが、関数内でアクセス可能なスコープには存在します。値はそこから取得され、実際には3
. コンソール出力4
。