2017-08-08 178 views
2

我是功能編程的新手,我很難理解以下功能的實際情況。Javascript高級功能

const someFnc = arg => arg("You can print that string :)"); 
someFnc(msg => console.log(msg)) 

從我能理解的是,我實際上將函數傳遞給函數someFnc。但是,函數arg怎麼可以自我調用爲arg(...)(在我的例子中是一個字符串參數)? 我真的很困惑這個概念。

+1

'arg'不是自我調用的。調用在'someFnc'的函數體中('arg(「您可以打印該字符串:)」)')。 – Xufox

+1

我不確定你的意思是「自我激勵」。 'someFnc'調用它在執行時聲明爲參數的函數'arg'。 – Bergi

回答

3

如果你打破它拆開,你可以看到這是怎麼回事:

function someFunction(fn) { 
    fn('hello') 
} 

function logFunction(msg) { 
    console.log(msg) 
} 

someFunction(logFunction) 

從本質上講,someFunction需要這應該是一個函數的參數(fn)。

然後它傳遞一個字符串("hello")作爲該函數的參數(fn('hello'))。

someFunction然後執行它收到的功能,所以它正在執行logFunction('hello')

logFunction需要一個字符串參數和控制檯日誌它(console.log('hello')

箭頭功能((arg) =>)是編寫function(arg) { }的簡寫。

0
const someFnc = arg => arg("You can print that string :)"); 

僅僅是讓匿名的方式:

function someFnc (arg) { 
    arg("You can print that string :)"); 
} 

您定義的其他匿名函數:

msg => console.log(msg) 

這使得anoynous函數,它msg,它使用一個呼叫到console.log。由於它只是用第一個參數調用console.log,因此它是一個不做任何事情的包裝。你的確可以只用console.log替換爲:

someFnc(console.log) 

現在使用替代規則,我們可以用替換爲綁定變量參數的函數體替換函數調用,從而:

arg("You can print that string :)");  // replace arg with console.log 
// === 
console.log("You can print that string :)"); 

現在,當您使用JavaScript編寫裸字時,如parseInt,它是一個變量。它評估爲一個函數。因此parseInt("10"); // ==> 10。在函數的主體arg中是一個變量,它獲取對象console上的屬性log的值。它是一個像parseInt一樣的功能。變量是值,函數也是值。

當您將值傳遞給函數時,它將綁定到定義中的變量。它甚至可以陰影現有的其他功能:

((parseInt, value) => parseInt(value))(Number, "10"); 
// => 10 

這樣,規則與參數替換約束變量,因此它是真的:

Numer("10"); //=> 10 

變量僅供值的名稱。一個函數是一個值,你可以在()之後應用,可選地包含參數。

+0

_「只是匿名的方式」_ - 從ES 2015開始,上面代碼片段中的函數將具有[推斷的函數名稱](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ Global_Objects/Function/name#Inferred_function_names)'someFnc'。 – Xufox

+0

@Xufox是的,那是真的。它使調試更容易,分析器從最近的綁定中修飾函數對象,但分配的表達式使得匿名函數成爲可能。 IMO'((fun => fun.name)(()=> 1)''也可以返回'fun',但它不會。 – Sylwester

+0

不是msg => console.log(msg)一個lambda函數不是包裝器? – JtR