【发布时间】:2010-03-18 19:18:59
【问题描述】:
目的是构建一个包装器,以提供在各种脚本主机上调用具有可变数量的本机函数的一致方法 - 以便脚本可以在浏览器以及 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 之前)引擎上执行。
现在是问题部分:还有其他解决方案吗?
【问题讨论】:
-
目前使用的 Javascript 引擎不支持
.apply()? -
你指的是哪些原生函数?我想不出任何因环境而异的论点
-
没有一个平台具有如此过时的 Javascript 实现,不会引起您的担忧。在这样的平台上,您可能最不担心这个问题。
-
小型企业通常买不起现代硬件和软件 - 仍然有数以万计 - 如果不是更多 - 使用古老的浏览器运行 win9x 系统并使用长期不受支持的预打包 Windows 脚本主机版本
-
@meouw - 您在大多数浏览器中都有
window.alert(),但在 Windows Script Host 中没有window.alert()- 要改用WScript.echo()方法。
标签: javascript function wrapper javascript-framework variable-length