1

引数が関数内で既に呼び出されているかどうかを確認する最善の方法は何だろうと思っています。

私がやりたいことの須藤コード:

function returnArg(arg){
 if(argHasbeenCalled){
   return "foo";
  }   
  else{
    return arg;
  }
}

私の解決策は次のとおりです。

var myArray = [];
function returnFoo(arg){

    if(jQuery.inArray(arg, myArray) < 1){
        return "Foo";
    }   
    else {
        return "bar";
    }
    newArray.push(arg);
}
4

3 に答える 3

2

コードは、配列に引数を格納する前に戻ります。

else ブランチにヒットしない限り、配列に引数を格納する必要はありません。したがって、次のようなものを検討してください。

var myArray = [];
function returnFoo(arg)
{
  if (jQuery.inArray(arg, myArray) === -1)
  {
    return "Foo";
  }   
  else
  {
    myArray.push(arg);
    return "bar";
  }
}
于 2013-10-19T16:37:31.087 に答える
1

あなたが望むのはmemoizationと呼ばれると思います。引数が処理されたかどうかを知りたいだけの場合は、結果に関心がないということとまったく同じではありませんが、同様のアプローチを使用できます。

var myFn = (function (processedArgs) {
    return function (arg) {
        if (processedArgs[arg]) {
            console.log('already processed');
            //do something
            return;
        }

        console.log('not processed');
        //do something
        processedArgs[arg] = true;
    };
})({});

myFn(1); //not processed
myFn(1); //already processed

ただし、argがオブジェクトの場合は、オブジェクトを一意にするプロパティを使用してキーを生成する必要があります。それが不可能な場合は、オブジェクトをマップとして使用する代わりに配列に格納し、array.indexOf(arg)オブジェクトが配列内にあるかどうかを確認するために使用できます。

を使用することもできますObjectMap。残念ながら、ブラウザーはまだサポートMapしていませんが、以前にリンクされた回答は、自分で実装する方法を示しています。

于 2013-10-19T16:36:27.743 に答える