2

面白いクイズに出会いました

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巻き上げられましたか?
  • 巻き上げ中に変数オーバーライドは発生しますか?
4

2 に答える 2

3

関数fooはしばらく置いておきます。関数内で、変数がその関数内のどこかで宣言されている場合、宣言は関数の先頭に移動されます。で、実際はこんな感じで評価される

function bar() {
    var foo;
    return foo;
    foo = 10;
    foo = '11';
}

ただし、同じ名前で宣言された関数がある場合は、それが優先され、このように評価されます

function bar() {
    var foo = function() {};
    return foo;
    foo = 10;
    foo = '11';
}

そのためfunction、アラート ボックスが表示されます。

于 2014-09-23T06:56:51.980 に答える
0

関数内にないvar変数は、デフォルトでグローバル変数になります。

別の関数内に関数宣言がある場合(例のように)、最初に巻き上げられ、その後に変数宣言が続きます。

変数のオーバーライドを示す例。

function bar() {
    var foo = 10;
    function foo() {}
    return foo;
}

bar(); //--> returns 10;

function bar() {
   var foo;
   function foo() {}
   return foo;
}

bar(); //--> returns the function object foo.
于 2014-09-23T07:04:42.157 に答える