我可以将N个参数传递给.bind()

时间:2018-07-13 18:39:22

标签: javascript

这就是问题,可以说我有一个包装到变量中的函数:

var myFunction = function(param1, param2) {
    // do stuff
}

我正在这样做:

var functionParameters = { data1: 1, data2: 2};
myFunction.bind(null, functionParameters.data1, functionParameters.data2);

如果函数需要更多参数,如何使它更通用?

因为我无法控制可执行的功能和参数。

功能和参数可以由用户设置,而我只是在执行它们。

2 个答案:

答案 0 :(得分:0)

您可能想尝试传播操作

function fn(a,b,c){
    console.log(a,b,c)
}

你可以做

const paras = [1,2,3];
const myFun = fn.bind(null, ...paras)

调用1,2,3时它将打印myFun()

但是,它仅适用于数组。

如果您正在寻找键值映射类型的解决方案,则可能需要编写一个将值转换为数组的粘合函数。

例如,您有一个对象类型

const paras = {b:1, a:2, c:3};

您可以通过

将其转换为数组
const arrayParas = ['a','b','c'].map(field => paras[field])

然后您可以绑定功能

const myFun = fn.bind(null, ...arrayParas)

编辑:如果您不知道该字段/如何从函数中获取参数名称

Js的toString会将一个函数转换为包含该函数输入参数的字符串。

但是您需要确保函数中输入参数的名称与对象中的字段名称完全相同。

// get function parameter name
function getParameterNames(func) {
  const STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
  const ARGUMENT_NAMES = /([^\s,]+)/g;
  const fnStr = func.toString().replace(STRIP_COMMENTS, '');
  const result = fnStr.slice(fnStr.indexOf('(') + 1, fnStr.indexOf(')')).match(ARGUMENT_NAMES);
  if (result === null)
    result = [];
  return result;
}
//
function fn(a, b, c) {
  console.log(a, b, c)
}

const paraObjs = {
  c: 3,
  a: 1,
  b: 2
};
const fields = getParameterNames(fn);
const paraArray = fields.map(field => paraObjs[field]);
const myFun = fn.bind(null, ...paraArray)

myFun();

答案 1 :(得分:0)

如果我现在理解正确,则可以使用Object.valuesSpread Syntax来完成此操作:

var myFunction = function(param1, param2) {
  console.log(param1);
  console.log(param2);
}

var functionParameters = {
  data1: "test",
  data2: "another test"
};

var run = myFunction.bind(null, ...Object.values(functionParameters))
run();


旧答案

我想最简单的解决方案就是简单地传递一个数组...

var myFunction = function(args) {
  args.forEach((i) => console.log(i));
}

var functionParameters = {
  1: "test",
  2: "another test",
  3: "another one"
};

var run = myFunction.bind(null, Object.values(functionParameters)) //Get array of values from the object
run();


如果您打算像示例中那样仅发送对象的特定值,则可以使用Rest Parameters

var myFunction = function(...args) {
  args.forEach((i) => console.log(i));
}

var functionParameters = {
  data1: "test",
  data2: "another test",
  data3: "another one"
};

var run = myFunction.bind(null, functionParameters.data1, functionParameters.data2, functionParameters.data3) //Get array of values from the object
run();

//myFunction("This", "function", "will", "now", "take", "unlimited", "parameters");