1

X個の引数を持つ関数があります。関数が引数を含むオブジェクトを受け入れ、それでも正しく機能するかどうかに興味がありました。

例:

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

vs

  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が配列バージョンの場合は、を使用して呼び出します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オブジェクトにはlengthプロパティがあり、配列(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 に答える