javascript - js 有優雅的辦法從外部 hijack 函數入參嗎?
問題描述
let fn = (a, b, c) => { console.log(a, b, c)}fn1(0, 0, 0) // output: 0 0 0
想要 fn 每次調用的時候第二個參數總是加 2
即
fn(0, 0, 0) // output: 0 2 0fn(1, 1, 1) // output: 1 3 1
目前只找到一種很丑的寫法去 hijack:
fn = (_ => { const innerFn = fn const newFn = (a, b, c) => { innerFn(a, b + 2, c) } Object.assign(newFn, innerFn) return newFn})()
有沒有更好一點的包裝方法?
問題解答
回答1:方法是沒錯,不過我總覺得你寫的有點別扭……我覺得直接一點比較好……
// 原函數function fn(a, b, c) { console.log(a, b, c)}// 加工函數const addTwo = (fn) => (a, b, c) =>fn(a, b + 2, c);// 生成新函數const newFn = addTwo(fn);newFn(0, 0, 0); //0 2 0回答2:
想要 fn 每次調用的時候第二個參數總是加 2
呃呃呃。。其實無非就是分別給參數加上 0, 2, 0
也就是說從函數 fn 生成另外一個 偏函數 fnOffset
把 [0, 2, 0] 這三個參數 分別加到 fn(a, b, c) 上的 a b c 上
更廣義的說:
把 [ .... ] 這 n 個參數 分別加到 fn() 的 arguments 的對應位置上
function fn(a, b, c){ console.log(a, b, c); }function adder(arr, fn, _this){ _this = _this || window; var toAdd = arr.slice(0, fn.length); return function(){var argu = Array.prototype.slice.call(arguments); fn.apply(_this, toAdd.map((item, idx) => { return argu[idx] + item; })); }}var fnOffset = adder([0, 2, 0], fn); fnOffset(0, 0, 0); fnOffset(2, 1, 0);
用 fn020 做變量名 應該更優雅把 = =
回答3:你描述的東西有點像ES6的Proxy,但是這個是無法polyfill的,可能不太適合在前端用。
相關文章:
1. python小白,問一個關于可變類型和不可變類型底層的問題2. python把第x列數據寫入第x個文件3. javascript - js 對中文進行MD5加密和python結果不一樣。4. python - Django前臺url未能正確訪問方法求助?5. 數據庫 - mysql boolean型無法插入true6. mysql - 我用SQL語句 更新 行的時候,發現全部 中文都被清空了,請問怎么解決?7. mysql服務無法啟動1067錯誤,誰知道正確的解決方法?8. python - 請問matplotlib.pyplot.save的路徑如何更改9. mysql - SQL問個基礎例子,書上的,我怎么看都看不懂..誰幫我解釋一下第2個為什么和第1個一樣?10. python - Shadowsocks的從剪貼板導入URL功能是怎么把剪貼板中復制的ss://XXXXXXXXXX這種鏈接轉換成具體賬號信息的?
