2016-10-13 58 views
0

我嘗試了關閉和運行此代碼:調用功能,關閉

var addTo = function (passed) { 
 
var add = function(inner){ 
 
    return passed + inner; 
 
}; 
 
return add; 
 
} 
 
var x = addTo(2); 
 
console.log(x(4));

我不明白爲什麼這個代碼,只有當我們的console.log和唐用VAR X工作用console.log(addTo(4));謝謝你的回答!

+6

'AddTo就'返回一個函數,所以如果你控制檯登錄'addTo(4)',你將記錄一個需要被調用的函數本身,然後才能從中獲得有意義的東西。 –

+1

因爲它會變成:'console.log(addTo(2)(4));' – Ultimater

回答

0

解壓代碼。如果我們開始與

var addTo = function (passed) { 
var add = function(inner){ 
    return passed + inner; 
}; 
return add; 
} 
var x = addTo(2); 
console.log(x(4)); 

然後讓我們忽略範圍並將其解壓:

function actualAdd(passed, inner){ 
return passed + inner; 
}; 

function addTo(passed) { 
return function(x) { return actualAdd(passed, x); 
} 

var addSomethingTo2 = addTo(2); 

// This is a handle for the actualAdd() function, 
// in which "passed" is always the value 2. 
console.log(addSomethingTo2); 

var thisIsSix = addSomethingTo2(4); 

// By calling addSomethingTo2(4) we run the calculation 
// 2 + 4 and return the result of that: 6 
console.log(thisIsSix); 
0

addTo函數返回另一個函數,該函數add

當你x = addTo(2)x值現在是功能add,它可以訪問2你傳遞給addTo值。

當你做console.log(x(4))你做x = addTo(2)後,等於做console.log(addTo(2)(4))這意味着:

  • 調用addTo2作爲參數
  • addTo回報add有權訪問傳遞2因到關閉
  • 調用addTo返回的函數(函數add),參數爲4
  • 回報passedinner

總和綜上所述,它不會與console.log(addTo(4))工作,因爲通過addTo返回的值是另一個功能,因此console.log會簡單地打印出類似這樣Function