2017-04-13 110 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); 
} 

會不會有理由使用一個比其他?他們是否有任何性能/安全影響(或對初學者JS開發人員有其他意想不到的影響)?

+0

那麼......在第一個例子中,不可能調用fun2。 – Quentin

+0

第二個例子更適合重用性。現在你可以在其他函數中再次調用function ** fun2 **。 – user3004449

+0

@Quentin從'fun1'外面不可能,裏面不是。 – Arg0n

回答

0

如果我們討論您的第一種方法,則不可能調用fun2,因爲您已將其包含在fun1之內,並且其範圍是本地範圍。然而,你可以ammend你fun1調用fun2如下:

var fun1 = (function(){ 

    var x = 1; 

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

    return { 
     fun2: fun2 
    } 

})(); 

以上return語句會讓你fun2public範圍,你可以按如下與fun1對象調用它:

fun1.fun2(); 

請注意,x變量是私有的,只能在fun1函數內訪問。如果您需要使用fun1.x訪問它,則必須返回fun1,因爲我已返回fun2

這叫做modular or enclosed pattern。由此我們可以實現封裝。

如果我們談論你的第二種方法,即非常簡單,你的fun1將調用fun2。我希望,它清除了這個概念。

2

主要區別在於第一種情況fun2將僅在fun1範圍內可用。在第二種情況下,這兩種功能都可在範圍內使用,其定義如下:

0

在Javascript範圍內由封閉函數定義。也就是說,函數中定義的代碼在函數外部是不可見的。

因此,在您第一次例如,func2裏面func1定義,因而可見只有func1

在第二個示例中,它在全局範圍內定義(window對象,在瀏覽器中運行時),因此可以在任何地方調用,就像func1一樣。

相關問題