2017-10-13 200 views
0

我最近學習JavaScript並碰到這段代碼。調用Javascript函數返回一個未定義值的函數

function sayIntro(name,age){ 

var address = "TX"; 

return function(name,age,address){ 
console.log("I am "+ name + " \nI am "+ age + " \nfrom "+address); 
}; 

} 

sayIntro("john",27)(); 

按我的理解,結果是不確定的,因爲恢復功能前面的兩個變量的範圍內 不可用。仍然如何獲得輸出如下?

I am john 
I am 27 
from TX 
+0

你只需陰影變量名。將它們重命名爲內部函數中的其他內容,並且它工作正常。 – deceze

+0

'sayIntro'的變量仍然在匿名函數的範圍內 - 這不是問題。問題是有一組全新的參數具有相同的名稱,這些名稱不是傳遞值,並且因爲它們具有相同的名稱,所以它們隱藏了其他變量。 'return function(){'解決。 – Ryan

+0

謝謝,但爲什麼這個問題得到減號?問是不是很愚蠢? –

回答

0

內部函數的參數會影響外部函數參數和變量。你可以直接訪問內部函數中的變量,因爲當它試圖找到一個變量時,它從它的作用域開始,如果沒有找到,則進入外部作用域,在這種情況下是外部函數的作用域並找到它們。

但是,如果您在內部函數中聲明參數,則會創建它們,並且因爲您沒有爲它們傳遞值,所以它們的值是undefined。所以你得到undefined

或者從內部功能

return function() { 
    console.log("I am "+ name + " \nI am "+ age + " \nfrom "+address); 
}; 

刪除或只是刪除address並調用內部函數,並傳遞給它的參數。

return function(name, age) { 
    console.log("I am "+ name + " \nI am "+ age + " \nfrom "+address); 
}; 

... 

sayIntro()("john",27); 

function sayIntro(name,age){ 
 

 
    var address = "TX"; 
 

 
    return function(){ 
 
     console.log("I am "+ name + " \nI am "+ age + " \nfrom "+address); 
 
    }; 
 

 
} 
 

 
sayIntro("john",27)();

+0

感謝您的詳細解釋,我明白髮生了什麼,因此根據您提到的第二種方式,當調用第一對括號時,不向外部函數傳遞參數,第二對括號將名稱和年齡傳遞給內部函數對? –

+0

第一次調用返回內部和第二次調用傳遞參數 –

+0

ok和內部函數充當閉包? –