面白いクイズに出会いました
function bar() {
return foo;
foo = 10;
function foo() {}
var foo = '11';
}
alert(typeof bar());
私の解釈は次のようなものです(コンソールによるとこれは間違っています:)):
var foo; // global variable
function bar(){
function foo(){}
var foo; // Here variable foo should override foo function
return foo; // (according to me foo should be variable with undefined value) What is going on here, How JavaScript resolve naming order ?
foo = 10;
foo = "11";
}
これは私がこれを読んでいる参照です
JavaScript では、次の 4 つの基本的な方法のいずれかで名前がスコープに入ります。2. 仮パラメータ: 関数は、その関数の本体にスコープされる名前付きの仮パラメータを持つことができます。3. 関数宣言: 関数 foo() {} の形式です。4. 変数宣言: これらは var foo; の形式を取ります。
彼は後に引用しました:
覚えておくべき最も重要な特別なケースは、名前解決の順序です。名前が特定のスコープに入る方法は 4 つあります。上にリストした順序は、それらが解決される順序です。一般に、名前が既に定義されている場合、同じ名前の別のプロパティによってオーバーライドされることはありません。これは、関数宣言が変数宣言よりも優先されることを意味します。これは、その名前への代入が機能しないという意味ではなく、宣言部分が無視されるというだけです。
上記の例を参照して、誰でもこれを単純化できますか? 知りたい主なポイント:
- 関数内にない変数はどのように
var
巻き上げられましたか? - 巻き上げ中に変数オーバーライドは発生しますか?