我正在解決一個旨在使用閉包的練習。您必須創建一個函式,該函式回傳一個將存盤值的函式,并且當您重用它時,將新值添加到已保存的值中。
const firstValue = myFunction(3);
const secondValue = firstValue(4);
// result => 7
這是我用來練習閉包的代碼:
function addNumbers(num) {
let storage = 0
let n = num
function adding(n) {
storage = n;
return storage
}
return adding(n)
}
let firstAttemp = addNumbers(4)
let secondAttemp = firstAttemp(3)
console.log(firstAttemp)
這會引發錯誤“未捕獲的 TypeError:firstAttemp 不是函式”
uj5u.com熱心網友回復:
const addNumbers = (a) => (b) => a b
它被稱為柯里化,更多細節在這里。
PS如果你想使用function語法,它看起來像這樣:
function addNumbers(a) {
return function (b) {
return a b
}
}
uj5u.com熱心網友回復:
正如@skara 在他們的評論中所說,return adding(n)回傳呼叫的結果adding而不是回傳函式,以便以后可以使用firstAttemp(3).
不幸的是,盡管它仍然不起作用,因為您實際上并沒有分配傳遞給addNumber以后添加的值。
function addNumbers(num) {
let storage = 0;
let n = num;
function adding(n) {
storage = n;
return storage;
}
return adding;
}
let firstAttemp = addNumbers(4);
let secondAttemp = firstAttemp(3);
console.log(firstAttemp);
console.log(secondAttemp); // 3! ??
您實際上不需要手動將 的值保存num到變數中,因為它是在回傳的閉包中捕獲的adding。
function addNumbers(num) {
function adding(n) {
return num n;
return storage;
}
return adding;
}
let firstAttemp = addNumbers(4);
let secondAttemp = firstAttemp(3);
console.log(secondAttemp); // 7 ????
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/491004.html
標籤:javascript 功能 范围 关闭 可重用性
