1

我有一个带有 X 参数的函数。我很好奇函数是否会接受一个包含 args 的对象并且仍然可以正常工作。

例子:

  var x = 0;
  var y = 0;
  var z = "test";
  someFunction(x,y,z);

对比

  var obj = new Object();
  obj.x = 0;
  obj.y = 0;
  obj.Z = "test";
  somefunction(obj);

对比

  var obj = new Array();
  obj.push(0);
  obj.push(0);
  obj.push("test");
  somefunction(obj);

我知道你可以对其进行编程来处理它,但我很好奇函数是否能够接受不同格式的参数,只要它们都在那里。

编辑:

将对象收集在一起时,我似乎遇到了各种各样的语法错误。我是什么意思?我的意思是我有一些接受一些参数的函数,包括回调.....所以当试图写出来,并将所有的参数/回调放在一个数组中做somefunction.apply(objArray)时,它在添加项目时出错进入集合。我这样做的方式是:

 x = new Array();
 x = [url, 
function(){
    displayFile(url, 'image', null, ft_id, null, null, null, null, !MA.isiOS());
}, 
function(e){
    if(DEBUG) console.log('Error creating gallery thumbnail');
    alert('There was a problem creating a thumbnail');
    MA.hideMessage();
}
  ];
  newArray.push(x);

它似乎搞砸了 x 定义设置。这种方法不喜欢这样设置回调吗?

4

4 回答 4

3

如果obj是 Array 版本,它将使用Function.prototype.apply.

somefunction.apply(window, obj);

参数将作为个人传递

于 2012-09-27T16:19:38.213 回答
1

大多数 JavaScript 函数将参数视为可选,如果没有传递参数,它们将简单地设置为undefined,因此无论类型如何,您的函数都会被调用并尽其所能执行其任务。也就是说,您可以预测并防止某些明显的问题:

function moo(a,b)
{
    console.log(a + ' & ' + b);
}
moo('cat','dog');//logs cat & dog
moo();//logs undefined & undefined
moo({name1:'catbert',name2:'dogbert'});//logs [object Object] & undefined

正如您所看到的,在很多情况下您的函数可能会表现不佳,或者根本不会......为了解决这个问题,您可以像这样编写函数:

function moo(a,b)
{
    if (a instanceof Array)
    {
        return moo.apply(this,a);
    }
    if (a instanceof Object)
    {
        args = [];
        for (n in a)
        {
            if (a.hasOwnProperty(n))
            {
                args.push(a[n]);
            }
        }
        return moo.apply(this,args);
    }
    a = a || 'No argument a';//set default value for falsy arguments
    b = b || 'No argument b';
    console.log(a + '&' + b);
}

这有点冗长,但是这样,您的函数可以处理两个意外参数:

moo({name1:'catbert',name2:'dogbert'});//logs catbert & dogbert
moo();//logs No argument a & no argument b
moo(['foo','bar']);//foo & bar
//and of course:
moo('cow','bull');//still works

还要记住,任何额外的参数都将被忽略,所以

moo('cow','bull','sheep');//sheep is ignored

好吧,事实上,您仍然可以得到任何未在函数定义中定义的参数:

function noArgs()
{
    var argumentArray = Array.prototype.slice.call(arguments);
    //or = Array.prototype.slice.apply(arguments,[0]);
    console.log(argumentArray);
}
noArgs(1,2,3);//logs [1,2,3]

请注意,尽管arguments对象确实具有长度属性,并且可以让您像数组 ( arguments[0]) 一样访问每个参数,但它不是数组!这就是为什么你必须使用Array.prototype.slice.call(arguments). 这将返回一个数组,其中包含传递给函数的所有参数。


只是一个旁注:最好不要使用new Array()构造函数调用来实例化一个新的数组对象,只需使用文字符号:[2,3,4,5]. 对于对象也是如此:{bar:'foobar'}.
尤其是数组构造函数。当您想要一个看起来像的数组时,看到它可能会导致问题[123]new Array(123)返回一个具有 123 个索引的数组,全部设置为undefined

于 2012-09-27T16:42:27.917 回答
0

是的,它将接受任何格式..但您的函数somefunction应该处理所有这些格式。

另外,是否将其传递到那里也没关系..

function someFunction(a,b,c,d) {
   alert(a + ' ' + b + ' ' + c + ' ' + d)
}

someFunction();  // alerts undefined undefined undefined undefined
someFunction({a: 'test'}, 10, 20, 30); //alerts [Object object] 10 20 30
于 2012-09-27T16:20:33.110 回答
0

您可以这样做,但您必须通过变量名访问参数的属性。像这样

var obj = new Object();
obj.x = 0;
obj.y = 0;
obj.z = "test";
somefunction(obj);

function somefunction(param) {
    param.x; //0
    param.y; //0
    param.z; //test
}

您还可以使用变量访问函数参数arguments

function somefunction() {
    var param = arguments[0];
    param.x; //0
    param.y; //0
    param.z; //test
}

在本地,,你不能。有关解决方案,请参阅user1689607的答案。

于 2012-09-27T16:23:06.620 回答