コンパイラが関数を検索してからグローバルスコープ内で変数b
を検索するため、以下の関数はb is not defined
を返します。JavaScriptのグローバル変数、変数なしで定義された変数
しかし、単語var
のないbを定義すると自動的にグローバル変数が作成されると仮定しましたか?
var
という単語を省略すると誰もルールを説明できますか?
function foo(a) {
console.log(a + b);
b = a;
}
foo(2);
コンパイラが関数を検索してからグローバルスコープ内で変数b
を検索するため、以下の関数はb is not defined
を返します。JavaScriptのグローバル変数、変数なしで定義された変数
しかし、単語var
のないbを定義すると自動的にグローバル変数が作成されると仮定しましたか?
var
という単語を省略すると誰もルールを説明できますか?
function foo(a) {
console.log(a + b);
b = a;
}
foo(2);
それがグローバルに変数宣言のための機能でvar
をん使用して、しかし、あなたの場合には、JavaScriptエンジンは、このライン当たっていない:それは、この行を打つ前に
console.log(a + b);
を:
b = a;
そして、それはそれを(グローバルに)宣言する行です。
そして、あなたはvar
を使用していないので、宣言は、それがvar
であったであろうコードベースの上(に掲揚されていない - あなたはまだb
の値を得なかったであろう唯一の宣言になるためホイスト、初期化ではなく、それはエラーを投げていないだろう)、あなたはあなたのエラーを取得します。
var
と吊り上げについてhereを参照してください。 strictモードで
:宣言されていない変数を使用して
がスローされます。宣言されていない変数に代入
がスローされます宣言されていない変数を読み込む機能
b
を読み込もうとすると、例外が発生します。
"use strict"
ガイドラインに従うためには、
このように宣言された変数b = a
は、var
キーワードで宣言された変数のようにホイストされません。これは、実行時に、コンパイラはbを未定義ではなく(var b = a
と同じように)読み込みますが、まったく存在しないので、ReferenceErrorをスローします。
は、巻き上げの情報:https://developer.mozilla.org/en-US/docs/Glossary/Hoisting
それが定義されていないので、そこ 'console.log' Bです。 – Mahi
そうですが、定義する前に変数 'b'を使用しようとしていますが、' b = a; 'の後にconsole.logを移動すると4 – Stu