传递函数时arguments []中的意外变量

时间:2017-02-17 06:22:02

标签: javascript node.js prototype apply

我在文件夹中有两个文件 - index.jsutil.js,其代码库如下所示

util.js中

let obj = {}
obj.sendTransaction = () => {
  console.log(arguments);
  return new Promise((resolve, reject) => {
    // try {
    //   let data = ethFunction.call()
    //   resolve(data)
    // } catch (e) {
    //   reject(e)
    // }
  });
}
module.exports = obj

Index.js中,如果我将参数传递给addNewParticipant或其变体,那么它们就不会出现在util.js中的参数对象中,例如

const addNewParticipant = (foo, bar) => {
  var ethFunction = myContract.addParticipant.sendTransaction
  console.log(ethFunction);
  EthUtil.sendTransaction()
}

const addNewParticipantTwo = (foo, bar) => {
  var ethFunction = myContract.addParticipant.sendTransaction
  console.log(ethFunction);
  EthUtil.sendTransaction(ethFunction, foo, bar)
}

并将其称为addNewParticpant(1, 2)addNewParticpantNew(1, 2),数字1和2不会出现在util函数的arguments对象中。实际上,arguments对象保持不变,4个输入描述了node_modules中包含Bluebird的一些函数和文件以及对index.js本身的引用

我的最终目标是

  1. 将功能从index.js传递到util.js

  2. 传递未知数量的变量

  3. 调用传递的函数并将未知数量的变量应用于它

  4. 将所有内容包含在承诺中并进行一些数据验证

  5. 理想情况下,arguments[0]代表我将传递的函数,另一个代表值。然后我会用

    var result = arguments[0].apply(null, Array().slice.call(arguments, 1));
    

    如果有帮助,我想传递的功能有一个可选的回调功能

1 个答案:

答案 0 :(得分:1)

正如评论中已经提到的,胖箭头没有自己的thisarguments个对象。您正在记录的arguments对象来自模块加载器创建的函数及其传递的参数。

您可以使用“常规功能”,或者在这种情况下,您可以使用...rest parameter

并且,避免延迟反模式。

//first a little utility that might be handy in different places:
//casts/converts a value to a promise,
//unlike Promise.resolve, passed functions are executed
var promise = function(value){
    return typeof value === "function"?
        this.then( value ):
        Promise.resolve( value );
}.bind( Promise.resolve() );

module.exports = {
    sendTransaction(fn, ...args){
        return promise(() => fn.apply(null, args));
    }   
}