繁体   English   中英

使用对象值作为参数调用JavaScript函数

[英]Call JavaScript Function using object values as parameters

我有一个对象:

var obj = {
    foo: 'foo',
    bar: 'bar'
};

我有一个功能:

var f = function(bar, foo) {
    // Do something with bar and foo
};

有没有一种方法可以动态地使用对象调用函数,以便obj ['foo']作为'foo'参数传递,而obj ['bar']作为'bar'参数传递? 注意,我可能不知道键和值的实际名称或函数参数名称,所提供的只是一个示例,因此f.call(this, obj['bar'], obj['foo']); 不会的

当然,在ES6中

 var f = function({bar, foo}) { console.log('foo', foo, 'bar', bar) }; var obj = { foo: '11', bar: '22' }; f(obj) 

根据deceze的评论,我设法提出了一个解决方案。 我不确定这有多快,但是可以完成工作。 欢迎改进! 感谢大家的帮助。

我从这个答案中使用了这个功能:

function getParameterNames(fn){
    var fstr = fn.toString();
    return fstr.match(/\(.*?\)/)[0].replace(/[()]/gi,'').replace(/\s/gi,'').split(',');
}

并做了如下:

var obj = {
    foo: 'foo',
    bar: 'bar'
};

var f = function(bar, foo) {
    // Do something with bar and foo
};

var sortedArgs = [];
getParameterNames(f).forEach(function(item) {
    sortedArgs.push(args[item]);
});

f.apply(this, sortedArgs);

您可以检查提供的参数是否为对象,然后使用解构

 var obj = { foo: 'foo', bar: 'bar' }; var f = function(foo, bar) { if(typeof arguments[0] == 'object') var {foo, bar} = arguments[0]; console.log('Foo: ' + foo); console.log('Bar: ' + bar) }; f(obj); f('lorem', 'ipsum'); 

您可以对象绑定到函数。

bind()方法创建一个新的功能,调用它时,具有其this关键字设置为所提供的值,与前述的当新功能被调用任何设置参数给定的序列。

 var obj = { foo: 'foo', bar: 'bar' }, f = function(k) { console.log(this[k]); }.bind(obj); f('foo'); 

您可以编写一个将包装您的函数并使用新函数的函数,以获取所需的函数。

 function wrapper(fn) { var fnString = fn.toString(); var fnRegex = /\\((.*)\\)/; var params = fnString .match(fnRegex)[1] .replace(/\\s/, '') .split(',') .filter(function(arg) { return arg; }); return function (o) { var args = params .map(function(arg) { return o[arg]; }); return fn.apply(null, args); } } // Example: your function. function yourFunc(foo, bar) { console.log('my foo: ' + foo); console.log('my bar: ' + bar); } // wrap your function and use new function instead. var enhancedFunc = wrapper(yourFunc); enhancedFunc({foo: 1, bar: 2}); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM