其目的是构建一个包装以提供一种在各种脚本宿主上调用具有可变参数的本机函数的一致方法 - 以便可以执行该脚本在浏览器中以及在Windows Script Host或其他脚本引擎中。
我知道3种方法,每种方法都有其自身的缺点。如何在JavaScript中创建一个可变参数(带有可变长度参数列表)函数包装
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
准备。这也会使剧本成为巨大的比例,并且违背神圣的原则。该脚本可能会在不支持
apply()
方法的较旧(JavaScript 1.3/ECMA-262-3)引擎上执行。
现在问题部分:有没有其他解决方案呢?
今天使用的Javascript引擎不支持'.apply()'? – SLaks 2010-03-18 19:22:34
你的意思是哪个本地功能?我想不出任何根据环境而有不同参数的 – meouw 2010-03-18 19:25:51
没有这样一个过时的Javascript实现的平台将足以让你担心。很有可能在这样的平台上这个问题将成为你最担心的问题。 – Pointy 2010-03-18 19:26:59