目的は、さまざまなスクリプトホストで可変アリティを使用してネイティブ関数を呼び出す一貫したメソッドを提供するラッパーを構築することです。これにより、スクリプトをブラウザーだけでなく、WindowsScriptHostやその他のスクリプトエンジンでも実行できるようになります。
私は3つの方法を知っていますが、それぞれに独自の欠点があります。
eval()
方法:function wrapper () { var str = ''; for (var i=0; i<arguments.lenght; i++) str += (str ?', ':'') + ',arguments['+i+']'; return eval('[native_function] ('+str+')'); }
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]); } }
apply()
方法:function wrapper () { return [native_function].apply([native_function_namespace], arguments); }
あなたが尋ねる彼らの何が問題になっていますか?
eval()
さて、私たちはなぜ悪であるかすべての理由を掘り下げましょうか?また、すべての文字列の連結...「エレガント」とラベル付けされるソリューションではありません。最大値
n
、つまりcases
準備する数を知ることはできません。これはまた、スクリプトを巨大な比率にまで伸ばし、聖なるDRYの原則に反して罪を犯します。apply()
スクリプトは、メソッドをサポートしていない古い(JavaScript 1.3 / ECMA-262-3より前の)エンジンで実行される可能性があります。
さて、質問の部分:そこに別の解決策はありますか?