【JavaScript】從實現函數柯里化複習 JavaScript 核心知識

// 柯里化定義:一個函數可以接受多個參數,反覆被調用 // 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章