2014-10-03 72 views
1

對不起,如果它是一個noob問題,但我仍然無法理解其用法的差異,所以我無法搜索谷歌與正確的關鍵字來搜索。在JavaScript中使用()函數

我在關注this教程Closure

現在我的查詢是針對該代碼 -

function makeFunc() { 
    var name = "Mozilla"; 
    function displayName() { 
    alert(name); 
    } 
    return displayName; 
} 

var myFunc = makeFunc(); 
myFunc(); 

爲什麼displayName被一個函數在代碼中的屬性引用?難道是它需要一個閉合功能,因爲我試過這個代碼將返回一個屬性 -

function makeFunc() { 
    var name = "Mozilla"; 
    function displayName() { 
    alert(name); 
    } 
    return displayName(); 
} 

var myFunc = makeFunc(); 
myFunc(); 

輸出 - 一個警報,但錯誤TypeError: myFunc is not a function

讓我知道什麼時候使用什麼或什麼基本概念,我在這裏失蹤。

回答

1

在第一種情況下,您將返回一個函數引用,您可以稍後使用它。在第二種情況下,由於您沒有返回任何內容,因此您要返回的函數結果爲undefined。所以錯誤出現,因爲myFunc不是對函數的引用,因此不能被調用。

除了上述情況,當你說「財產」時,我不知道你的意思。

+0

Thx爲答案..在哪個用例中,我們需要'返回函數引用'? – Trialcoder 2014-10-03 06:17:06

+1

當你想存儲上下文時,你可以返回一個函數。該函數將引用父函數的變量。 – 2014-10-03 06:23:48

+0

Thx我接受你的答案..雖然有了屬性,我指的是我們在OOP編程術語中有什麼屬性和方法,屬性如'var name =「Mozilla」;'這裏的名字是屬性..我知道如果這不是在JavaScript世界中的情況。 – Trialcoder 2014-10-03 06:27:36

1
return displayName() 

該代碼返回的不是函數,而是調用該函數的結果。

var myFunc = makeFunc(); 
myFunc(); 

same.in myFunc不是函數,而是結果。

嘗試這樣做:

return displayName; 
... 
var myFunc = makeFunc(); //makeFunc() will return displayName() function 
myFunc(); 
3

「返回顯示名;」正在返回函數displayName。
然後將結果設置爲myFunc。

function makeFunc() { 
    var name = "Mozilla"; 
    function displayName() { 
    alert(name); 
    } 
    return displayName; 
} 

var myFunc = makeFunc(); 
myFunc(); 

這是比較容易理解,如果你認爲的:
功能顯示名(){}
作爲替代: 顯示名=函數(){}

makeFunc = function() { 
    var name = "Mozilla"; 
    displayName = function() { 
    alert(name); 
    } 
    return displayName; 
} 

var myFunc = makeFunc(); 
myFunc(); 
1

理解倒閉之前,這是一個從Javascript函數範圍擴展的概念。 Closures:允許在創建的範圍內訪問某些變量。內部函數可以訪問外部函數及其變量。但外部函數不能訪問內部函數內的變量。

因此,在你的閉包例子中,輸出警告「Mozilla」的原因是你的內部函數displayName警告外部函數中聲明的名稱變量(displayName可以訪問makeFunc函數中的任何變量)。所以當你的makeFunc函數調用內部函數displayName時,你會得到一個TypeError,其中包含undefined。只需調用makeFunc()就會輸出相同的結果,您將得到未定義的結果。