2011-02-04 6 views
17

に引数を渡す:Javascriptを - 私はいつものように関数に引数を渡すまし機能

setValue('foo','#bar') 

function setValue(val,ele){ 
    $(ele).val(val); 
}; 

は愚かな例を許して。しかし、最近私は多くの議論を取るいくつかの機能を持つプロジェクトに取り組んできました。だから私は、(わからないことがそれを置くための正しい方法の場合)オブジェクトとして引数を通過始めたので、のような:

setValue({ 
    val:'foo', 
    ele:'#bar' 
}); 

そして機能に:

function setValue(options){ 

    var value = options.val; 
    var element = options.ele; 

    $(element).val(value); 

}; 

私の質問は、それを行うには良い方法がありますか?これらの「オプション」を呼び出すのは、一般的なプラクティス(または大丈夫)ですか?そして、一般的に、オプションを選択して、関数内にローカル変数を設定する(より良い用語がないために)解凍する必要がありますか?そのうちの1つが定義されていない場合に備えて、私はこのようにしています。

私は本当に悪い習慣をつくっておらず、醜いコードを書いています。どんな援助も私に感謝し+ます。ありがとう。

+1

はのように思えますあなたはすべて正しいことをやっている。また、はい、{}はJSのオブジェクト(リテラル表記)です。私の唯一のコメントはoptions.valを別の関数に単純に渡すことができるときにもローカルのような値を使用することです(ただし、1回以上参照する必要がある場合には意味があります)。 –

+0

それは私が好奇心をそそられたものでした。だから私は、例のような関数には必要ないと思いますが、varをたくさん参照する必要がある場合は、それを設定するのが理にかなっています。クール。 – jyoseph

答えて

14

私は関数内の各オプションに新しい変数を宣言しない限り、まったく同じことをします。

私はoptsに短縮していますが、オプションはそれに適した名前だと思います。

関数内には、使用可能な各オプションのデフォルト値を指定する「デフォルト」オブジェクトが常にあります(単純にnull)。私はjQueryを使用しているので、$ .extendを使用して、デフォルトとユーザ指定のオプションを次のようにマージすることができます:var opts = $.extend({}, defaults, opts);

+0

私は$ .extendのアイデアが大好きです。それをさらに見て行くと、ありがとう! – jyoseph

2

jQueryの実装を見ると、オプションクラスを使用して任意のパラメータ数の関数を処理するので、あなたは良い会社だと思います。

他の方法はarguments.lengthをテストすることですが、引数が常にオプション性の同じ順序である場合にのみ機能します。

1

何も問題ありません。

「オプション」は、任意の名前と同じように見えます。

あなたはそれらを「解凍」する必要はありませんが、同じ項目に何度もアクセスする場合は、ローカル変数のアクセスが一般的にプロパティよりも速いため、ローカル変数でそれらを参照する方が少し効率的ですルックアップ。

10

私はこれが素晴らしいパターンだと信じています。私は、このようなオプションオブジェクトが他の言語では(少なくともオブジェクト作成のコンテキストでは)「ビルダーオブジェクト」と呼ばれると聞いてきました。ここに利点のいくつかは以下のとおりです。あなたの関数の

  • ユーザーがパラメータのいるご注文何を心配する必要はありません。このメソッドは、引数がかかるあなたのような場合に特に便利です。それらを混ぜるのは簡単ですし、JavaScriptは文句を言うことはありません!
  • 特定のパラメータをオプションにすることは簡単です(これは、プラグインまたはユーティリティを作成する際に便利です)。

しかし、いくつかの落とし穴があります。具体的には、関数のユーザーがオプションのいくつかを指定できず、コードが異常終了することがあります(これは通常のJS関数でも起こることがあります。ユーザーは正しい引数を指定する必要はありません)。これを処理するための良い方法が必要とされていないパラメータのデフォルト値を提供することである。

var value = options.val || 0; 
var element = options.ele || {}; 

$(element).val(value); 

正しい引数を指定されていない場合にも、直ちにまたはthrow an exception関数から返すことができます。

ビルダーオブジェクトを処理する方法を学ぶには、jQueryUIなどのソースをチェックするのがよいでしょう。

+0

'var value = options.val ||の星の例0 ' - それはトンを助けるでしょう。素晴らしいリンクもあります。ありがとう、トン! – jyoseph

4

私はこの質問は歳で実現するが、私はJavaScript関数に任意の数の引数を渡すためにクリーンな方法は、配列を使用してapply方法で構築されたと思う:

fun.apply(object, [argsArray]) 

funobjectは関数を実行するスコープ/コンテキストであり、argsArrayは引数の配列です(これは渡される引数の数に制限はありません)。

今現在の落とし穴は引数はは配列(リテラルまたはオブジェクト)でなければならず、{arg ':6、' arg2 ': "stuff"}のような配列のようなオブジェクトではありません。 ECMAScript 5では、配列のようなオブジェクトを渡すことができますが、IE9やChromeではなく、現時点ではFireFoxでしか動作しないようです。

2

これは、すべての機能は、渡されたすべてのパラメータが含まれている非常に多くのJSの配列のようなオブジェクト(それはlengthが、配列関数のどれを持っている)であるargumentsと呼ばれるボーナスのパラメータを持っていることを覚えておく価値がある。

便利そうでない場合は、パラメータの範囲(例えば

function Sum() { 
    var i, sum = 0; 
    for (i=0; i < arguments.length; i++){ 
     sum+=arguments[i]; 
    } 
    return sum; 
}; 

に渡したいとあなただけの多くのパラメータを持っている場合は、説明してきたように、のparamsオブジェクトを使用します。

関連する問題