2016-12-17 6 views
0

私はちょうど理由を理解できませんa1 =機能varスコープ&クロージャでJavascriptを深く理解するには?

と私の価値は( FNに渡されたものである)、それはVARによりoverrwritedたかどうか

問題は同じ名前(var &機能)に起因するように見えます!

function fn(a) { 
 
    console.log("a1 = " + a); 
 
    var a = 2; 
 
    function a() { } 
 
    console.log("a2 = " + a); 
 
} 
 
fn(1); 
 
// a1 = function a() { } 
 
// a2 = 2 
 

 
function fnx(ax) { 
 
    console.log("a1 = " + ax); 
 
    var ax = 2; 
 
    function b() { } 
 
    console.log("a2 = " + ax); 
 
} 
 
fnx(1); 
 
// a1 = 1 
 
// a2 = 2 
 

 
/* it equal to the final version */ 
 
function fn(a) { 
 
    var a; 
 
    a = function() { } 
 
    // function hoisting > variable hoisting 
 
    console.log("a1 = " + a); 
 
    a = 2; 
 
    console.log("a2 = " + a); 
 
} 
 
fn(1); 
 
// a1 = function a() { } 
 
// a2 = 2

+0

https://repl.it/languages/javascript – xgqfrms

+0

https://repl.it/Es1v/0 – xgqfrms

答えて

2

私はなぜ、A1 =機能を理解できないのですか?

関数の宣言は、以下のとおりです。彼らは

  • に表示される機能のトップに掲揚

    1. は、彼らが表示される機能の範囲で(関数と同じ名前の)ローカル変数を宣言しますで
    2. は、その変数の値として自らを割り当てます(これは関係ありません引数の定義は、あまりにもそれを行うため)

    およびfnに渡された私の値1は、(ある)、

    は、それがVAR aでoverrwritedれたかどうかの関数宣言

    によって上書き?

    という名前のローカル変数が既に存在するため、varは無視されます。

    割り当ては、2つのconsole.logステートメントの間の関数を上書きします。


    あなたのコードでは、と事実上同じである:とにかく

    function fn(a) { 
        a = function a() { }; 
        console.log("a1 = " + a); 
        a = 2; 
        console.log("a2 = " + a); 
    } 
    fn(1); 
    
  • +0

    、どうもありがとう!しかし、それは非常にあなたが言ったことを理解するのは簡単ではないようだ! – xgqfrms

    関連する問題