Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript参数数目未知_Javascript_Variables_Arguments - Fatal编程技术网

Javascript参数数目未知

Javascript参数数目未知,javascript,variables,arguments,Javascript,Variables,Arguments,在我的项目中,我将不同的函数(具有不同数量的参数)注册为多个事件的侦听器。当事件发生时,我需要启动相关函数。我接收以数组形式传递给侦听器方法的参数,而侦听器函数期望每个单独的参数。所以,我是这样做的,但我不喜欢这种方法,我想知道是否有一种优雅的方法 function callListenerWithArgs(func, args){ switch(args.length){ case 1: func(args[0]);

在我的项目中,我将不同的函数(具有不同数量的参数)注册为多个事件的侦听器。当事件发生时,我需要启动相关函数。我接收以数组形式传递给侦听器方法的参数,而侦听器函数期望每个单独的参数。所以,我是这样做的,但我不喜欢这种方法,我想知道是否有一种优雅的方法

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();
        }
    }
用这个试试

使用。应用

func.apply(null, args)
如果需要绑定到特定的作用域,可以传入另一个参数作为函数中的
this

func.apply(scope, args);
var f = function ( ) { console.log(arguments.length); }
f( 2, 3 )  // > 2
另外,JavaScript的一个细微差别是,您可以使用未定义的值调用函数。因此,对现有代码进行一个小的调整将在95%的情况下有效(这不是一个建议的解决方案,只是指出它):

如果您的
func
定义为:

function foo(a, b, c){
}
您将获得传入的
a
b
c
,以及一些被忽略的
未定义的值。正如我上面所说,这在95%的情况下有效。如果您在被调用函数中检查
参数。长度
,则该函数无效,因为无论函数定义的参数数量如何,它都将始终相同。

functionName.apply(thiscope,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);

请参阅。

您可以获得函数的参数数:

func.apply(scope, args);
var f = function ( ) { console.log(arguments.length); }
f( 2, 3 )  // > 2
这使您可以直接就地实现
func
函数

function func() {
  var nbArgs = arguments.length;
  // ...
}

.调用不接受数组。申请does@cwolves. 再看一次我的答案。@cWolfs我编辑得很快(在你评论之前)哈哈。不知怎么的,你在错误的地方看到了它^ ^谢谢大家。有趣的是,apply正是我所需要的。它简单而甜蜜:)并且精确地解决了我的问题。