簡體   English   中英

Javascript未知數量的參數

[英]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){
}

你得到abc傳入,以及一些被忽略的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM