それは非常に簡単です: JS はVariable 宣言を現在のスコープの先頭に引き上げますが、もちろん、操作 (代入を含む) は引き上げられません (同じスコープ内で、2 番目のケースの説明を参照してください)。したがって、スニペットは次のように翻訳されます
(function()
{
var currentSize;//undefined
if (currentSize == 'hi')//always false
{
currentSize = 'hello';//assignment that will never be
}
alert(currentSize);//alerts undefined, of course
}());
var を省略すると、スコープ スキャン (グローバル スコープで宣言されている変数のチェック) に進みます。悲しいことに、そうすることで、var の最初の使用のコンテキストが (ブランチ内で) 失われ、代入も巻き上げられます。暗黙のグローバルは次のように変換されます:
ありがたいことに、これは真実ではありません。コンソールでこれを裏付けるように思われるいくつかのことをテストしたため、そうであると思いました。この場合、@amadan は正しいです。グローバル変数を使用しています (greeting
これを投稿したときに誤ってスニペットで呼び出されました)。暗黙のグローバルが実際に何であるかを示すために、以下のコードを残します (修正済み)。JS でスコープ/スコープスキャンを理解するのに役立つことを願っています。
var currentSize = 'hello';
//well, actually implied globals can be deleted, so it's more like
Object.defineProperty(this,'currentSize',{value:undefined,
writable:true,
enumerable:true,
configurable:true});
(function()
{
if (currentSize == 'hi')//always false
{//this still doesn't get executed
currentSize = 'hello';//assignment that will never be
}
alert(currentSize);//alerts undefined
}());