簡體   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