目的是构建一个包装器,以提供在各种脚本主机上调用具有可变数量的本机函数的一致方法 - 以便脚本可以在浏览器以及 Windows 脚本主机或其他脚本引擎中执行。
我知道 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 之前)引擎上执行。
现在是问题部分:还有其他解决方案吗?