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. MYSQL新建用户设置可以远程访问的问题2. python - 求一个在def中可以实现调用本def满足特定条件continue效果的方法(标题说不太清楚,请见题内描述)3. java - mybatis怎么实现在数据库中有就修改,没有就添加4. $fields = $values = [];这条代码一直定义不了,一直报错,老师的源码也是被报错的,执行不了,请问该怎么解决这个问题5. node.js - nodejs和前端JavaScript 字符串处理结果不一样是什么原因?6. mysql - SQL操作时间的函数?7. mysql - 我的myeclipse一直连显示数据库连接失败,不知道为什么8. mysql 5.7单表300万数据,性能严重下降,如何破?9. mysql 为何insert的时候会有lock wait timeout 异常10. mysql同步数据到elasticsearch用什么工具?
![$fields = $values = [];这条代码一直定义不了,一直报错,老师的源码也是被报错的,执行不了,请问该怎么解决这个问题](http://www.haobala.com/attached/image/news/202205/093622cb60.png)