1

目的は、さまざまなスクリプトホストで可変アリティを使用してネイティブ関数を呼び出す一貫したメソッドを提供するラッパーを構築することです。これにより、スクリプトをブラウザーだけでなく、WindowsScriptHostやその他のスクリプトエンジンでも実行できるようになります。
私は3つの方法を知っていますが、それぞれに独自の欠点があります。

  1. eval()方法:

    function wrapper () {
        var str = '';
        for (var i=0; i<arguments.lenght; i++)
            str += (str ?', ':'') + ',arguments['+i+']';
        return eval('[native_function] ('+str+')');
        }
    
  2. switch()方法:

    function wrapper () {
        switch (arguments.lenght) {
            case 0:
                return [native_function] (arguments[0]);
                break;
            case 1:
                return [native_function] (arguments[0], arguments[1]);
                break;
            ...
            case n:
                return [native_function] (arguments[0], arguments[1], ... arguments[n]);
            }
        }
    
  3. apply()方法:

    function wrapper () {
        return [native_function].apply([native_function_namespace], arguments);
        }
    

あなたが尋ねる彼らの何が問題になっていますか?

  1. eval()さて、私たちはなぜ悪であるかすべての理由を掘り下げましょうか?また、すべての文字列の連結...「エレガント」とラベル付けされるソリューションではありません。

  2. 最大値n、つまりcases準備する数を知ることはできません。これはまた、スクリプトを巨大な比率にまで伸ばし、聖なるDRYの原則に反して罪を犯します。

  3. apply()スクリプトは、メソッドをサポートしていない古い(JavaScript 1.3 / ECMA-262-3より前の)エンジンで実行される可能性があります。

さて、質問の部分:そこに別の解決策はありますか?

4

2 に答える 2

3

を使用するだけapply()です。そして、時代遅れの実行エンジンの場合は、これを実行してください

if ( 'undefined' == typeof Function.prototype.apply )
{
  Function.prototype.apply = function( context, args )
  {
    // whatever hacky way you want to implement it - i guess eval.
  }
}
于 2010-03-18T19:33:42.340 に答える
-1

自動の「this」変数と同様に、関数に渡されるすべての引数を保持する「arguments」変数があります。javascriptの可変個引数を参照してください。

于 2012-04-19T20:08:14.367 に答える