2016-07-31 10 views
0

私はJavascriptから実行コンテキストを勉強しています。しかし、私は "関数foo"が "var foo"によって書かれたものではない理由を理解していません。 私は誰かがこれを説明できることを願って、 あなたの責任に感謝します。実行コンテキストが2回宣言されましたか?

関数エース(){

console.log(typeof foo); // function pointer 
console.log(typeof bar); // undefined 

var foo = 'hello', 
    bar = function() { 
     return 'world'; 
    }; 

function foo() { 
    return 'hello'; 
} 
var foo = 'hello'; 

}

エース()。

+0

'foo'が – guest271314

答えて

0

"関数foo"は "var foo"によって上書きされません。

foofoo

function ace() { 
 

 
    console.log(typeof foo); // function pointer 
 
    console.log(typeof bar); // undefined 
 

 
    var foo = 'hello', 
 
    bar = function() { 
 
     return 'world'; 
 
    }; 
 

 
    function foo() { 
 
    return 'hello'; 
 
    } 
 
    var foo = 'hello'; 
 
    console.log(foo); 
 
    try { 
 
    foo() 
 
    } catch(e) { 
 
    console.log("catch:", e.message) 
 
    } 
 
} 
 

 
ace();

0

再定義されているが、私は「関数foo」は上で書き込まれますない理由を理解しないラインで上書きされます"var foo"

var宣言は、関数宣言を上書きしません。両方とも同じ変数を宣言し、関数宣言のために関数で初期化されます。値を上書きするのは割り当てだけです。あなたが考慮に巻き上げ取る場合

は、あなたのスクリプトが

function ace() { 
    var foo, bar; 
    var foo = function() { 
     return 'hello'; 
    } 
    var foo; 

    console.log(typeof foo); // function 
    console.log(typeof bar); // undefined 

    foo = 'hello'; 
    bar = function() { 
     return 'world'; 
    }; 
    console.log(typeof foo); // string 
    foo = 'hello'; 
} 
ace(); 
+0

があなたのRESPONSありがとうござい上書きされるように振る舞います。しかし、変数の前にアクティベーションオブジェクト上に関数が作成されていませんか?しかし、なぜ "関数foo"の名前が "var foo"によって上書きされるのでしょうか?すみません、理解しようとしています – Overste

+0

@Overste:関数は特殊な変数ではありません。関数宣言は変数を宣言し、それを関数オブジェクトで初期化するだけです。変数宣言は同じ変数を宣言するだけで、既に存在していない限り 'undefined'で初期化します。 'function foo'は' var foo'によって上書きされません。 'foo'は' foo = ... 'によって上書きされます。 – Bergi

+0

あなたの責任をありがとう。私はあなたに感謝したと思う。しかし、私は最後の質問を持っています。私は彼が言った記事を読む:fooが2回宣言されているにもかかわらず、関数は変数の前のメモリに作成されていることを作成段階から分かっている。それはそうではありません:var foo = function(){ return 'hello'; }とvar foo、barより大きい。 – Overste

関連する問題