// 柯里化定義:一個函數可以接受多個參數,反覆被調用
// fn(1,2,3,4,5)(6,7)(8,9,10) 該技術被命名爲函數柯里化
// 例子:求和功能,得到 55 的結果
// 不固定參數個數的函數 √
// 第一次執行返回函數 √
// 後續執行仍然返回函數 √
// 能緩存參數 √
// 內部函數 閉包 二次緩存函數 √
// 閉包的應用場景:避免全局變量的命名衝突
function currying() {
// arguments:獲取參數;僞數組:其具備數組的屬性,不包含函數
const args = Array.prototype.slice.call(arguments)
// const args = [].__proto__.slice.call(arguments) // 也可以使用 [].__proto__ 對象原型通過原型鏈查找 slice 方法
// Array.prototype.slice 是一原型上的方法
// call 改變函數調用內部 this 指向(call:多個參數;apply:數組;bind:多個參數,返回新函數)
// 數組方法依賴於內部是 this 數據容器來執行
// console.log(args); // 真實數組
// 一個函數訪問外部的變量 就形成閉包 (ps:函數嵌套函數是高階函數,不是閉包)
const inner = function () {
// console.log(args);
args.push(...arguments)
return inner
}
// 如何獲取結果值?
// 1.單獨寫方法獲取結果值(只能獲取值)
inner.getValue = function () {
return args.reduce((res, ele) => {
return res + ele
}, 0)
}
// 額外需求:可以允許將返回值,進行二次計算
// 2.早期瀏覽器可以使用 toString 直接返回值;不規範,現在被禁止了
// inner.toString = inner.getValue = function(){
// return args.reduce((res,ele)=>{
// return res + ele
// }, 0)
// }
// 3.修改 inner 計算原始數據類型的方式
// 在 Symbol.toPrimitive 屬性 (用作函數值) 的幫助下,一個對象可被轉換爲原始值。
// 該函數被調用時,會被傳遞一個字符串參數 hint ,表示要轉換到的原始值的預期類型。
// hint 參數的取值是 "number"、"string" 和 "default" 中的任意一個。
inner.__proto__[Symbol.toPrimitive] = function(hint){
if(hint == 'number'){
return inner.getValue() // 預期爲計算時直接返回值
}
if(hint == 'string'){
return inner.toString()
}
return true
}
return inner
}
const res = currying(1, 2, 3, 4, 5)(6, 7)(8, 9, 10)
// 方法獲取
// const resNum = res.getValue() // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
// console.log(resNum) // 55
// 可以允許將返回值,進行二次計算
console.log(res - 1 ) // 54
【JavaScript】從實現函數柯里化複習 JavaScript 核心知識
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.