如何实现Lodash的_.flip方法?JS多参数反转问题求助
Hey there! 看起来你已经搞定了返回值取反的部分,现在要实现Lodash的_.flip,核心就是反转函数的参数顺序对吧?我来给你捋捋思路和具体实现:
首先得明确_.flip的核心作用:它会返回一个新函数,当你调用这个新函数时,会把传入的参数倒序传给原函数。比如原函数接受a, b, c,翻转后调用时传1,2,3,原函数实际拿到的是3,2,1。
实现思路拆解
- 收集所有参数:在返回的新函数里,用ES6的剩余参数语法
...args来获取调用时传入的所有参数,比arguments对象更直观也更灵活。 - 反转参数顺序:直接用数组的
reverse()方法就行,但要注意reverse()会修改原数组,所以最好先复制一份参数数组(比如用[...args]展开复制)再反转,避免意外修改原参数。 - 传递反转后的参数给原函数:用扩展运算符
...把反转后的参数数组展开,传给原函数func。 - 保留this绑定:返回普通函数而不是箭头函数,这样原函数的
this上下文能正确传递(比如原函数是对象方法时,调用翻转后的函数仍能绑定正确的this)。
具体代码实现
function flip(func) { // 返回普通函数,确保this能正确绑定到调用上下文 return function(...args) { // 复制参数数组并反转,避免修改原args const reversedArgs = [...args].reverse(); // 把反转后的参数传给原函数并返回结果 return func(...reversedArgs); }; }
测试示例
来试试这个函数的效果:
// 原函数:接受问候语和名字,返回拼接字符串 function greet(greeting, name) { return `${greeting}, ${name}!`; } // 生成翻转后的函数 const flippedGreet = flip(greet); // 调用时参数顺序反过来:先传名字,再传问候语 console.log(flippedGreet('Alice', 'Hello')); // 输出:Hello, Alice!
如果原函数依赖this,也能正常工作:
const person = { name: 'Bob', // 原方法:接受问候语和对象,返回带上下文的问候 sayHi(greeting, target) { return `${greeting} ${target}, I'm ${this.name}!`; } }; const flippedSayHi = flip(person.sayHi); // 用call绑定this,传入参数顺序反转 console.log(flippedSayHi.call(person, 'Alice', 'Hey')); // 输出:Hey Alice, I'm Bob!
对比你之前写的invert函数,flip的核心是处理参数顺序,而不是返回值取反——如果需要同时实现两者,你可以把这两个函数组合起来用~
内容的提问来源于stack exchange,提问作者VisualXZ
相关产品推荐
相关产品推荐

