我是功能編程的新手,我很難理解以下功能的實際情況。Javascript高級功能
const someFnc = arg => arg("You can print that string :)");
someFnc(msg => console.log(msg))
從我能理解的是,我實際上將函數傳遞給函數someFnc。但是,函數arg怎麼可以自我調用爲arg(...)(在我的例子中是一個字符串參數)? 我真的很困惑這個概念。
我是功能編程的新手,我很難理解以下功能的實際情況。Javascript高級功能
const someFnc = arg => arg("You can print that string :)");
someFnc(msg => console.log(msg))
從我能理解的是,我實際上將函數傳遞給函數someFnc。但是,函數arg怎麼可以自我調用爲arg(...)(在我的例子中是一個字符串參數)? 我真的很困惑這個概念。
如果你打破它拆開,你可以看到這是怎麼回事:
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) { }
的簡寫。
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
變量僅供值的名稱。一個函數是一個值,你可以在()
之後應用,可選地包含參數。
_「只是匿名的方式」_ - 從ES 2015開始,上面代碼片段中的函數將具有[推斷的函數名稱](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ Global_Objects/Function/name#Inferred_function_names)'someFnc'。 – Xufox
@Xufox是的,那是真的。它使調試更容易,分析器從最近的綁定中修飾函數對象,但分配的表達式使得匿名函數成爲可能。 IMO'((fun => fun.name)(()=> 1)''也可以返回'fun',但它不會。 – Sylwester
不是msg => console.log(msg)一個lambda函數不是包裝器? – JtR
'arg'不是自我調用的。調用在'someFnc'的函數體中('arg(「您可以打印該字符串:)」)')。 – Xufox
我不確定你的意思是「自我激勵」。 'someFnc'調用它在執行時聲明爲參數的函數'arg'。 – Bergi