javascript - js 有優(yōu)雅的辦法從外部 hijack 函數(shù)入?yún)幔?/h1>
瀏覽:140日期:2023-09-21 18:52:02
問題描述
let fn = (a, b, c) => { console.log(a, b, c)}fn1(0, 0, 0) // output: 0 0 0
想要 fn 每次調(diào)用的時候第二個參數(shù)總是加 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:方法是沒錯,不過我總覺得你寫的有點別扭……我覺得直接一點比較好……
// 原函數(shù)function fn(a, b, c) { console.log(a, b, c)}// 加工函數(shù)const addTwo = (fn) => (a, b, c) =>fn(a, b + 2, c);// 生成新函數(shù)const newFn = addTwo(fn);newFn(0, 0, 0); //0 2 0回答2:
想要 fn 每次調(diào)用的時候第二個參數(shù)總是加 2
呃呃呃。。其實無非就是分別給參數(shù)加上 0, 2, 0
也就是說從函數(shù) fn 生成另外一個 偏函數(shù) fnOffset
把 [0, 2, 0] 這三個參數(shù) 分別加到 fn(a, b, c) 上的 a b c 上
更廣義的說:
把 [ .... ] 這 n 個參數(shù) 分別加到 fn() 的 arguments 的對應(yīng)位置上
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);
![javascript - js 有優(yōu)雅的辦法從外部 hijack 函數(shù)入?yún)幔? src=]()
![javascript - js 有優(yōu)雅的辦法從外部 hijack 函數(shù)入?yún)幔? src=]()
用 fn020 做變量名 應(yīng)該更優(yōu)雅把 = =
回答3:你描述的東西有點像ES6的Proxy,但是這個是無法polyfill的,可能不太適合在前端用。
標(biāo)簽:
JavaScript
相關(guān)文章:
1. Docker for Mac 創(chuàng)建的dnsmasq容器連不上/不工作的問題2. javascript - 求賜教:網(wǎng)易郵箱Web端模擬登錄看信的加密參數(shù)_ntes_nnid、_ntes_nuid3. javascript - 使用angular 的ui-sref 中出現(xiàn)了中文參數(shù),點擊跳轉(zhuǎn)后瀏覽器的地址欄里出現(xiàn)轉(zhuǎn)義后的%AE....%a%44. java - ConcurrentHashMap中的get()方法為什么可以不加鎖?5. javascript - QWebEngineView 如何爬 angular 的動態(tài)數(shù)據(jù)?6. html5 - 這個代碼顯示功能如何實現(xiàn)?7. javascript - 用JS 七牛上傳圖片出現(xiàn)文件已存在的錯誤(file exists)8. 工作近5年,3年Java Web ,近2年前端,未來何去何從?9. css3 - 圖片等比例縮放10. java - 字節(jié)流轉(zhuǎn)成字符串之后,在通過字符串轉(zhuǎn)成字節(jié)流后的文件為什么會不一樣?
問題描述
let fn = (a, b, c) => { console.log(a, b, c)}fn1(0, 0, 0) // output: 0 0 0
想要 fn 每次調(diào)用的時候第二個參數(shù)總是加 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:方法是沒錯,不過我總覺得你寫的有點別扭……我覺得直接一點比較好……
// 原函數(shù)function fn(a, b, c) { console.log(a, b, c)}// 加工函數(shù)const addTwo = (fn) => (a, b, c) =>fn(a, b + 2, c);// 生成新函數(shù)const newFn = addTwo(fn);newFn(0, 0, 0); //0 2 0回答2:
想要 fn 每次調(diào)用的時候第二個參數(shù)總是加 2
呃呃呃。。其實無非就是分別給參數(shù)加上 0, 2, 0
也就是說從函數(shù) fn 生成另外一個 偏函數(shù) fnOffset
把 [0, 2, 0] 這三個參數(shù) 分別加到 fn(a, b, c) 上的 a b c 上
更廣義的說:
把 [ .... ] 這 n 個參數(shù) 分別加到 fn() 的 arguments 的對應(yīng)位置上
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 做變量名 應(yīng)該更優(yōu)雅把 = =
回答3:你描述的東西有點像ES6的Proxy,但是這個是無法polyfill的,可能不太適合在前端用。
