我試圖理解閉包,下面有這個例子
function outerFunction(outerVariable) {
return function innerFunction(innerVariable) {
console.log('outer variable: ' outerVariable)
console.log('inner variable: ' innerVariable)
}
}
const newFunction = outerFunction('outside')
newFunction('inside')
我不明白的部分是當我們將 outerFunction 函式分配給一個變數(最后兩行),然后將該變數作為傳遞另一個引數的函式呼叫時。我不知道里面發生了什么。
uj5u.com熱心網友回復:
Javascript 沒有對Currying的原生支持,即當您采用具有多個引數的函式并對其進行部分呼叫時。
呼叫僅提供一些引數的 Javascript 函式或方法會將所有未指定的引數設定為undefined. 該函式不會回傳已經設定了一些引數的部分函式,??而是嘗試使用一些未定義的引數來完成函式執行。
我們可以做的是在一個函式中創建一個新函式,然后回傳它。這是可行的,因為函式可以像 JavaScript 中的變數一樣對待。與回傳的任何其他變數一樣,新函式即使在離開其父函式的閉包后仍繼續存在。但是,該閉包中定義的其他值不再在范圍內。
這在原則上與在函式內部設定和{a: someVar, b: someOtherVar}的函式回傳物件沒有什么不同。和變數在閉包結束時消失,但它們的值現在在回傳的物件中。someVarsomeOtherVarsomeVarsomeOtherVar
將閉包視為限制可訪問的變數,而不是在資料結束時直接洗掉資料會有所幫助。
一個柯里化的例子:
const addThreeNumbers = (a, b, c) => {
return a b c;
}
// does not work as we would like it to
let addTenToTwoNumbers = addThreeNumbers(10); // value will be 10, rather than a curried function
let thirty = addTenToTwoNumbers(10, 10); // invalid, will break
const addThreeNumbersPartial = (a) => {
return (b, c) => a b c;
}
//now we can do this
addTenToTwoNumbers = addThreeNumbers(10);
thirty = addTenToTwoNumbers(10, 10);
這有用的原因并不明顯,但 JavaScript 像這樣動態創建和修改函式的能力非常強大。如果您對這個主題感興趣,我建議您閱讀函式式編程。
uj5u.com熱心網友回復:
function outerFunction(outerVariable) {
return function innerFunction(innerVariable) {
console.log('outer variable: ' outerVariable)
console.log('inner variable: ' innerVariable)
}
}
const newFunction = outerFunction('outside')
現在你可以想象newFunction成:
function newFunction(innerVariable) {
console.log('outer variable: ' 'outside')
console.log('inner variable: ' innerVariable)
}
outerFunction是一種功能工廠。在本例中,它產生了一個具有某些值的新函式,該函式現在是“內置”的outerVariable。newFunction現在只參考一個外部引數,即innerVariable.
或者換個例子:
function makeGreeterFunction(greetWord) {
return function greet(name) {
console.log(greetWord " " name "!")
}
}
const helloGreeter = makeGreeterFunction('hello')
const welcomeGreeter = makeGreeterFunction('welcome')
helloGreeter("Tony")
// Hello Tony!
welcomeGreeter("Tony")
// Welcome Tony!
uj5u.com熱心網友回復:
謝謝你們!我現在知道了。我贊成你的回答,但它沒有出現,因為我至少需要“15 個聲譽”。@Dakeyras @jswrr
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/535831.html
下一篇:如何根據類別過濾產品
