2017-03-15 114 views
2

首先抱歉,如果我沒有發佈在正確的地方,或者如果已經有重複,但我不知道該怎麼稱呼它或如何搜索它。JavaScript - 這個高級功能的含義

可有人請向我解釋什麼下面的代碼的意思是:

function noisy(f) { 
    return function(arg) { 
    console.log("calling with", arg); 
    var val = f(arg); 
    console.log("called with", arg, "- got", val); 
    return val; 
    }; 
} 
noisy(Boolean)(0); 
// → calling with 0 
// → called with 0 - got false 

爲什麼我需要調用函數後有(布爾)?

noisy(Boolean)(0); 

我該怎麼稱呼這種類型的函數調用?

在此先感謝!

+1

*「?爲什麼我需要調用函數後有(布爾)」 *這不是* *後的函數調用。 '吵鬧(布爾)'*是函數調用。你打電話給'吵吵鬧鬧'傳遞'布爾'作爲參數。 –

回答

5

這是棘手的東西。 (Boolean)可能會讓你失望,但實際上它只是一個常規的舊參數。您可以使用doStuff等功能代替Boolean,它仍然可以工作。

是的,正如你所指出的,這是一個重複的問題。你正在尋找一種叫做「關閉」的東西。這裏是從StackOverflow的一個夢幻般的回答:

How do JavaScript closures work?

+0

感謝您的回答,這真的幫了我很大的忙,我甚至發現我在閉門時仍然不夠好,否則我會知道這是一個。 –

+0

閱讀你發佈的鏈接後,例6實際上解釋了我的疑問。非常感謝! –

+1

不客氣!也許我還應該澄清一點,實際上,在您的示例中,您也正在處理[高階函數](https://en.wikipedia.org/wiki/Higher-order_function)(請參閱簡單定義的鏈接)。高階函數的一個例子是[回調函數](http://www.learn-js.org/en/Callbacks)(請參閱鏈接以獲得簡單解釋)。 –

2

「嘈雜」是一種函數,如果您調用它,它將返回一個函數。

通過將Boolean轉換爲函數,Boolean被稱爲Boolean(0),結果爲false,因爲0是一個虛假值。

Boolean只是一個構造函數,您可以使用它來創建布爾值或將任何值轉換爲布爾值。

1

您需要通過一個f - 它可能不是Boolean函數。嘗試

const increment = x => x+1; 
const noisyInc = noisy(increment); 
console.log(noisyInc(1)); 

在你的原代碼,中間變量被忽略 - 就像我在這裏寫noisy(increment)(1)

+0

對於它的價值,它*可能*是其他任何東西。使用'Boolean'也可以工作,因爲'Boolean'只會在沒有'new'的情況下使用它將(轉換)值轉換爲布爾值(並返回)。 – towerofnix

+0

@towerofnix是的,這就是'布爾'的作用。 – Bergi

2

您正在調用函數noisy(...),該函數返回使用其參數中的信息構造的另一個函數。該函數調用noisy(Boolean)(0);實際上是兩個函數調用,並可能(或許應該)寫爲:

var noisyFunction = noisy(Boolean) 
noisyFunction(0) 

noisy()取一個函數的事實(Boolean是一個函數MDN)。對這裏使用的語法沒有實際影響,它可能不需要任何參數,或者不需要任何參數。

您對高階函數標籤的選擇真的很有用。這是一個編程的例子。在noisy返回之後,fnoisyFunction可用的事實是關閉(MDN)的結果。有些程序員可能會將其描述爲「使用閉包」,但它並不特定於所示的模式。

+0

感謝您的回答,與其他答案類似,您幫助我向我解釋我可以以多種方式調用相同的函數,現在看起來像我習慣看到的閉包類型! –