2015-01-01 144 views
1

有人可以解釋爲什麼「myPet = pet(Vivie);」實際上並沒有調用寵物功能,但myPet()呢?這與我從Java學到的編程語言不同。謝謝。混淆調用Javascript函數

var pet = function(name) {     
    var getName = function() {  
    return console.log(name);    
    } 
    return getName;     
}, 

myPet = pet("Vivie"); // ???????? 
myPet(); // Returns "Vivie" 
+0

'myPet =寵物(薇薇);''調用pet',但它不叫'getName'。 –

回答

1

如果你來自一個不支持第一類函數一種語言,那麼它可以當你遇到一個沒有引起混亂。 A 頭等功能是一種可以傳遞給函數或從函數返回的函數,就像它是普通數據(如字符串或數字)一樣。下面的代碼應該提供一些線索:

var pet = function(name) { // assign anonymous func to pet    
    var getName = function() { // assign nested anonymous func to getName 
    console.log(name);  // prints to console; no return value    
    }; 
    return getName;   // return getName value: func definition 
}; 

myPet = pet("Vivie");  // assign getName value to myPet 
myPet();      // appending() invokes defined func 

「薇薇」被傳遞給函數的寵物擁有,但console.log()打印出來!這是通過一個稱爲關閉的功能完成的。由於name存在於嵌套函數的直接外部環境中,所以該變量綁定到它並且在外部函數(包含在pet中)執行後繼續存在,即使是

關於console.log(),請注意,將它作爲return語句的一部分編寫是不正確的,因爲日誌記錄方法永遠不會返回值;它只是打印到控制檯。所以,用下面的代碼:

var pet = function(name) {     
    var getName = function() {  
    return console.log(name);    
    } 
    return getName;     
}, 

myPet = pet("Vivie"); 
console.log(typeof myPet()); 
在最後的陳述

,myPet()執行造成「薇薇」將被打印到控制檯,但它返回什麼。所以,typeof返回「未定義」,並且結果也被打印到控制檯。見http://jsfiddle.net/yu75k5tz/

返回到傳遞函數的主題,請再次考慮前面的代碼片段。有通過使用函數調用鏈接到實現相同的結果的替代和更經濟的方式,如下所示:

pet("Vivie")();

第一組括號調用寵物它返回一個函數,雖然匿名。第二對括號會導致返回的函數執行。這段代碼消除了必須將getName賦值給一個變量,這反過來又減少了兩個語句到這個單行程。

最後,函數定義的尾部分號可能看起來很奇怪,但它們在語法上是正確的。每個匿名函數都被分配給一個變量,因此每個這些分號實際上終止一個賦值語句。

現場演示這裏:http://jsfiddle.net/kLghedp3/8/

0

pet()返回功能,並將其分配到myPet。如果你要調用的函數,pet()回報你也可以這樣做:pet('Vivie')();

0

pet()返回功能,並將其分配給您的變量myPet。所以Mypet()實際上調用該函數。如果你要調用的函數,寵物()返回你也可以這樣做:pet("some name")();

你可以嘗試編輯爲更好地理解下面的例子:

如果您註釋掉myPet = pet("Tushar");的代碼不會運行,因爲mypet()尚未分配任何東西。嘗試一下。

var pet = function(name) {     
 
    alert(name);     
 
}, 
 

 
myPet = pet("Tushar"); 
 
myPet();

0

如果您將一個執行控制檯一個代碼,你會得到答案可能。

myPet = pet("Vivie"); 

上面一行是指派的功能myPet其中h的身體像波紋管名稱的

function() {  
    return console.log(name); 
    } 

這裏值是從寵物功能的閉合到來。

當你打電話給myPet它調用該函數與name as Vivie

所以,如果你擔心你的功能pet沒有調用該方法,那是因爲在pet函數no-在哪裏函數已被調用。它只是返回函數定義本身。

如果你想pet功能打印retsult,定義它像波紋管

var pet = function(name) {     
    var getName = function() {  
    return console.log(name);    
    } 
    return getName();     
} 
0

通過此行myPet = pet("Vivie"); 您正在使用的一個參數VAR myPet沿分配功能。所以myPet將成爲另一個功能

var getName = function() {  
console.log(name);    
    } 

因此,你必須調用myPet();作爲獲得回報的功能。

0

這是JS函數和變量函數的區別,以下是你可以直接通過修改喜歡你的代碼中調用這個函數的這些

JS Functions Vs Variable Functions

了很好的解釋:

var pet = function(name) {     

    return console.log(name);    

}; 

pet("test1"); 
0

當您調用pet時,您所做的是返回函數並在函數作用域變量name上設置字符串「Vivie」。因此,您的myPet變量會接收getName值,這是一個打印函數範圍名稱變量值的函數。 通過你叫myPet,你已經調用由pet返回的功能,這是getName打印名稱變量,「薇薇」的預設值的時間。

希望幫助清除它。 :)

1

的javascript函數被看作DATA。所以你被允許使用函數作爲變量。

在下面一行,

myPet = pet("Vivie"); 

什麼你實際上做的是調用寵物功能,結束了返回的函數,並把它裏面myPet

但是,當你的代碼這一點,

myPet(); 

您呼叫myPet()函數[從寵物返回的功能。這是您將寵物分配給它後獲得的確切myPet。

就是這個原因,當你的代碼myPet();它調用該函數。

現在這裏有一個有趣的事情,

當你的代碼這一點,

var pet = function(name) {     
    return console.log(name);     
}, 

myPet = pet("Vivie"); 

它的工作原理!!!!爲什麼它的工作呢?

在這裏,當你打電話給寵物函數它會控制你的名字並返回控制檯。它沒有返回任何功能。

但在myPet你的代碼中得到一個功能。

讓考什麼我們知道從寵物

在你的情況看到返回的對象的類型:

var pet = function(name) {     
    var getName = function() {  
    return console.log(name);    
    } 
    return getName;     
} 

var myPet = pet("Vivie"); 
console.log(typeof myPet); // consoles : function. 

您所呼叫的寵物,但你在該返回的函數中沒有執行任何操作。而是你說你可以使用myPet執行這個返回的函數。

另一種情況:

var pet = function(name) {     
    return console.log(name);     
} 

var myPet = pet("Vivie"); // consoles : Vivie 
console.log(typeof myPet); // consoles : undefined 

首先您要執行的寵物,並返回這就是爲什麼當你問的typeof myPet你沒有得到任何定義類型的控制檯。

最後,如果你想立即調用返回的函數,那麼你應該這樣使用自調用函數。

myPet = pet("Vivie")(); 

這個故事告訴我們:

myPet = pet("Vivie"); 

這裏myPet寵物。而

myPet(); 

這裏myPet調用寵物

參考文獻:typeof

0

爲什麼你認爲myPet = pet("Vivie");不叫pet功能? pet顯然被調用並返回一個新的函數,它被分配到myPet

現在回到您的代碼。

myPet = pet("Vivie"); // ???????? 

那麼,它不會打印任何東西。它只是返回另一個功能。這叫做柯里格。您可以瞭解更多關於柯里here

myPet(); // Returns "Vivie" 

之所以是因爲養寵物而形成的封閉和返回的getName功能是在其範圍內返回「薇薇」的說法。所以getName可以看到並捕獲pet的論點(在這種情況下「Vivie」)的價值並保留它。 myPet()確實在調用getName的定義。您可以瞭解更多關於關閉here