2017-04-13 12 views
0

私はちょうどJavascriptで開発を始め、スコープと実行コンテキストで読んでいます。Javascript - 関数宣言の違い

function fun1() { 
    var x = 1; 

    function fun2() { 
     x = x*2; 
     alert(x); 
    } 
} 

と::

function fun1() { 
    var x = 1; 
    fun2(x); 
} 

function fun2 (x) { 
    x = x*2; 
    alert(x); 
} 

他の上に1を使用する理由があるだろう、この違いがあるのか​​と思いまして?パフォーマンス/セキュリティへの影響(または初心者のJS開発者には他の予期しない影響があります)はありますか?

+0

最初の例で 'fun2'を呼び出すことはできません。 – Quentin

+0

2番目の例は、再利便性に優れています。他の関数でも関数** fun2 **を呼び出すことができます。 – user3004449

+0

@Quentin 'fun1'の外からは不可能ですが、内部にはありません。 – Arg0n

答えて

0

私たちはあなたの最初のアプローチについて話す場合はfun1以内にそれを同封しており、その範囲がローカルであるので、fun2を呼び出すことはできません。しかし、あなたは次のようにfun2を呼び出すために、あなたのfun1をammendことができます。

var fun1 = (function(){ 

    var x = 1; 

    var fun2 = function(){ 
     x = x*2; 
     alert(x); 
    }; 

    return { 
     fun2: fun2 
    } 

})(); 

を上記のreturn文は次のようにfun1オブジェクトとそれを呼び出すことができますfun2publicとしてスコープようになります:

fun1.fun2(); 

x変数はプライベートであり、fun1機能内でのみアクセス可能であることに注意してください。 fun1.xを使用してアクセスする必要がある場合は、fun1に返信する必要があります。fun2が返されました。

これはmodular or enclosed patternと呼ばれます。これにより、カプセル化を達成することができます。

2番目のアプローチ、つまりかなり簡単なことについては、fun1fun2となります。私は、それがコンセプトをクリアすることを願っています。

2

最初のケースでは、fun2fun1のスコープでのみ利用可能になります。 2番目のケースでは、両方の関数がスコープで使用可能になり、その定義は

0

です。Javascriptスコープは囲み関数で定義されています。つまり、関数内で定義されたコードは、関数の外部では表示されません。

だから、あなたの第一の例では、func1内で定義でfunc2、ひいてはのみfunc1内部見えます。

2番目の例では、グローバルスコープ(ブラウザで実行している場合はwindowオブジェクト)で定義されているため、func1のようにどこからでも呼び出し可能です。