我有一个对象:
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']);
不会这样做。
答案 0 :(得分:1)
当然,在ES6中
var f = function({bar, foo}) {
console.log('foo', foo, 'bar', bar)
};
var obj = {
foo: '11',
bar: '22'
};
f(obj)
答案 1 :(得分:1)
根据deceze的评论,我设法找到了解决方案。我不确定它有多快,但它完成了工作。欢迎改进!感谢大家的帮助。
我在this answer使用了这个功能:
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);
答案 2 :(得分:0)
您可以检查提供的参数是否为object,然后使用destructuring
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');

答案 3 :(得分:0)
你可以bind该功能的对象。
bind()
方法创建一个新函数,在调用时,将其this
关键字设置为提供的值,并在给定的任何参数之前提供给定的参数序列调用新函数。
var obj = {
foo: 'foo',
bar: 'bar'
},
f = function(k) {
console.log(this[k]);
}.bind(obj);
f('foo');

答案 4 :(得分:0)
您可以编写一个函数来包装您的函数并使用新函数来获得您想要的函数。
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});