Node.js中如何动态获取函数参数?现有方法失效求助
解决Node.js箭头函数中无法获取正确arguments的问题
你遇到的问题核心在于箭头函数没有自己的arguments对象——它会继承外层作用域的arguments,而这里你的joinRoom是箭头函数,里面的arguments其实来自外层的Promise回调函数(也就是(resolve, reject)这两个参数),所以才会拿到错误的对象。
这里有两种简单的解决办法:
方法1:改用普通函数定义joinRoom
把箭头函数换成普通函数,这样函数会绑定自己的arguments对象,原来的代码就能正常工作:
joinRoom : function(io, socket, room) { return new Promise((resolve, reject) => { var mainArguments = Array.prototype.slice.call(arguments); log.debug(mainArguments); // 现在会正确输出[io, socket, room] log.debug("excute service :: joinRoom"); socket.join(room); resolve(true); }); }
方法2:使用ES6剩余参数语法(更推荐)
如果想继续用箭头函数,可以直接用剩余参数...来捕获所有传入的参数,这是更现代、更简洁的写法:
joinRoom : (...mainArguments) => { return new Promise((resolve, reject) => { log.debug(mainArguments); // 直接得到[io, socket, room]数组 log.debug("excute service :: joinRoom"); // 如果需要单独使用参数,还可以解构:const [io, socket, room] = mainArguments; socket.join(mainArguments[2]); resolve(true); }); }
补充说明
箭头函数设计的初衷就是简化代码,它不会创建自己的this、arguments、super或new.target绑定,这些值都来自外层的非箭头函数作用域。所以当你需要访问当前函数的参数时,要么改用普通函数,要么用剩余参数语法,后者在ES6及以后的环境(包括Node.js)都完全支持。
内容的提问来源于stack exchange,提问作者lee
相关产品推荐
相关产品推荐

