[英]Javascript unknown number of arguments
在我的項目中,我注冊了不同的函數(具有不同數量的參數)作為許多事件的監聽器。 當事件發生時,我需要觸發相關的功能。 我以數組的形式接收要傳遞給listener方法的參數,而listener函數期望每個單獨的參數。 所以,我這樣做,但我不喜歡這種方法,並想知道是否有一種優雅的方式,
function callListenerWithArgs(func, args){
switch(args.length){
case 1:
func(args[0]);
break;
case 2:
func(args[0], args[1]);
break;
case 3:
func(args[0], args[1], args[2]);
break;
case 4:
func(args[0], args[1], args[2], args[3]);
break;
default:
func();
}
}
使用.apply
func.apply(null, args)
如果您需要綁定到特定的范圍,可以在通過另一種說法為使用this
功能里面:
func.apply(scope, args);
此外,JavaScript的細微差別在於您可以使用未定義的值調用函數。 因此,對現有代碼進行小幅調整將在95%的情況下工作(這不是建議作為解決方案,只是指出它):
// will handle any number of args up to 7
function callListenerWithArgs(func, args){
func(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
}
如果您的func
定義為:
function foo(a, b, c){
}
你得到a
, b
, c
傳入,以及一些被忽略的undefined
值。 正如我上面所說,這在95%的情況下起作用。 如果您在被調用函數中檢查arguments.length
,它將不起作用,因為它始終是相同的,無論函數定義的參數數量是多少。
使用function.apply
嘗試這個
function callListenerWithArgs(func, args){
func.apply(window, args);
}
functionName.apply(thisScope, arguments)
會更優雅。 arguments
參數必須是數組。
您可以構建數組,如:
var args = [];
switch (arguments.length - 1) {
case 0:
break;
case 1:
args.push(arguments[1]);
break;
case 2:
args.push(arguments[1], arguments[2]);
break;
case 3:
args.push(arguments[1], arguments[2], arguments[3]);
break;
default:
args = Array.prototype.slice.call(arguments, 1);
}
或者如果數組已經構建,只需將它作為第二個參數傳遞給.apply
func.apply(this, args);
看到這里 。
您可以獲取函數的參數數量:
var f = function ( ) { console.log(arguments.length); }
f( 2, 3 ) // > 2
這使您可以直接實現您的func
功能。
function func() {
var nbArgs = arguments.length;
// ...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.