javascript - js 有優(yōu)雅的辦法從外部 hijack 函數(shù)入?yún)幔?/h1>
瀏覽:100日期:2023-09-21 18:52:02
問(wèn)題描述
let fn = (a, b, c) => { console.log(a, b, c)}fn1(0, 0, 0) // output: 0 0 0
想要 fn 每次調(diào)用的時(shí)候第二個(gè)參數(shù)總是加 2
即
fn(0, 0, 0) // output: 0 2 0fn(1, 1, 1) // output: 1 3 1
目前只找到一種很丑的寫(xiě)法去 hijack:
fn = (_ => { const innerFn = fn const newFn = (a, b, c) => { innerFn(a, b + 2, c) } Object.assign(newFn, innerFn) return newFn})()
有沒(méi)有更好一點(diǎn)的包裝方法?
問(wèn)題解答
回答1:方法是沒(méi)錯(cuò),不過(guò)我總覺(jué)得你寫(xiě)的有點(diǎn)別扭……我覺(jué)得直接一點(diǎn)比較好……
// 原函數(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í)候第二個(gè)參數(shù)總是加 2
呃呃呃。。其實(shí)無(wú)非就是分別給參數(shù)加上 0, 2, 0
也就是說(shuō)從函數(shù) fn 生成另外一個(gè) 偏函數(shù) fnOffset
把 [0, 2, 0] 這三個(gè)參數(shù) 分別加到 fn(a, b, c) 上的 a b c 上
更廣義的說(shuō):
把 [ .... ] 這 n 個(gè)參數(shù) 分別加到 fn() 的 arguments 的對(duì)應(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:你描述的東西有點(diǎn)像ES6的Proxy,但是這個(gè)是無(wú)法polyfill的,可能不太適合在前端用。
標(biāo)簽:
JavaScript
相關(guān)文章:
1. 網(wǎng)頁(yè)爬蟲(chóng) - python爬蟲(chóng)翻頁(yè)問(wèn)題,請(qǐng)問(wèn)各位大神我這段代碼怎樣翻頁(yè),還有價(jià)格要登陸后才能看到,應(yīng)該怎么解決2. python如何不改動(dòng)文件的情況下修改文件的 修改日期3. python 正則表達(dá)式提取4. 算法 - python 給定一個(gè)正整數(shù)a和一個(gè)包含任意個(gè)正整數(shù)的 列表 b,求所有<=a 的加法組合5. javascript - 微信h5發(fā)送圖文信息,部分設(shè)備點(diǎn)擊“發(fā)送”按鈕時(shí)沒(méi)反應(yīng),問(wèn)題較難重現(xiàn),如何能找到可能存在問(wèn)題的點(diǎn)?6. javascript - 微信小程序里怎么把頁(yè)面轉(zhuǎn)成圖片分享7. 大家好,請(qǐng)問(wèn)在python腳本中怎么用virtualenv激活指定的環(huán)境?8. python - 求一個(gè)在def中可以實(shí)現(xiàn)調(diào)用本def滿足特定條件continue效果的方法(標(biāo)題說(shuō)不太清楚,請(qǐng)見(jiàn)題內(nèi)描述)9. javascript - JS用ajax爬取百度外賣店家信息10. python - Pycharm調(diào)試代碼進(jìn)行列表遍歷時(shí),如何直接賦值指定元素
問(wèn)題描述
let fn = (a, b, c) => { console.log(a, b, c)}fn1(0, 0, 0) // output: 0 0 0
想要 fn 每次調(diào)用的時(shí)候第二個(gè)參數(shù)總是加 2
即
fn(0, 0, 0) // output: 0 2 0fn(1, 1, 1) // output: 1 3 1
目前只找到一種很丑的寫(xiě)法去 hijack:
fn = (_ => { const innerFn = fn const newFn = (a, b, c) => { innerFn(a, b + 2, c) } Object.assign(newFn, innerFn) return newFn})()
有沒(méi)有更好一點(diǎn)的包裝方法?
問(wèn)題解答
回答1:方法是沒(méi)錯(cuò),不過(guò)我總覺(jué)得你寫(xiě)的有點(diǎn)別扭……我覺(jué)得直接一點(diǎn)比較好……
// 原函數(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í)候第二個(gè)參數(shù)總是加 2
呃呃呃。。其實(shí)無(wú)非就是分別給參數(shù)加上 0, 2, 0
也就是說(shuō)從函數(shù) fn 生成另外一個(gè) 偏函數(shù) fnOffset
把 [0, 2, 0] 這三個(gè)參數(shù) 分別加到 fn(a, b, c) 上的 a b c 上
更廣義的說(shuō):
把 [ .... ] 這 n 個(gè)參數(shù) 分別加到 fn() 的 arguments 的對(duì)應(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:你描述的東西有點(diǎn)像ES6的Proxy,但是這個(gè)是無(wú)法polyfill的,可能不太適合在前端用。
