如何在JavaScript中创建可变(具有可变长度参数列表)函数包装器
其目的是构建一个包装器,以提供在各种脚本主机上使用变量arity调用本机函数的一致方法,从而使脚本可以在浏览器以及Windows脚本主机或其他脚本引擎中执行。如何在JavaScript中创建可变(具有可变长度参数列表)函数包装器,javascript,function,wrapper,javascript-framework,variable-length,Javascript,Function,Wrapper,Javascript Framework,Variable Length,其目的是构建一个包装器,以提供在各种脚本主机上使用变量arity调用本机函数的一致方法,从而使脚本可以在浏览器以及Windows脚本主机或其他脚本引擎中执行。 我知道有三种方法,每种方法都有自己的缺点 eval()方法: function wrapper () { var str = ''; for (var i=0; i<arguments.lenght; i++) str += (str ?', ':'') + ',arguments['+i+']';
我知道有三种方法,每种方法都有自己的缺点
eval()
方法:
function wrapper () {
var str = '';
for (var i=0; i<arguments.lenght; i++)
str += (str ?', ':'') + ',arguments['+i+']';
return eval('[native_function] ('+str+')');
}
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]);
}
}
function wrapper () {
return [native_function].apply([native_function_namespace], arguments);
}
apply()
方法:
function wrapper () {
var str = '';
for (var i=0; i<arguments.lenght; i++)
str += (str ?', ':'') + ',arguments['+i+']';
return eval('[native_function] ('+str+')');
}
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]);
}
}
function wrapper () {
return [native_function].apply([native_function_namespace], arguments);
}
eval()
是邪恶的所有原因?还有所有的字符串连接。。。这不是一个被贴上“优雅”标签的解决方案n
,也不可能知道需要准备多少案例。这也会将剧本扩展到巨大的规模,违背神圣干燥原则
apply()
方法的较旧(JavaScript 1.3/ECMA-262-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.
}
}
就像自动的“this”变量一样,有一个“arguments”变量保存传递给函数的所有参数。请参阅。今天使用的哪个Javascript引擎不支持
.apply()
?您指的是哪些本机函数?我想不出有哪一个平台会根据环境的不同而有不同的论点。没有哪一个平台具有如此过时的Javascript实现会引起您足够的兴趣。在这样的平台上,这个问题很可能是你最不担心的。小企业通常负担不起现代的硬件和软件——现在仍然有成千上万——如果不是更多的话——使用古老的浏览器和长期不受支持的预包Windows脚本主机运行win9x系统versions@meouw-您有window.alert()
在大多数浏览器中,但在Windows脚本主机中没有window.alert()
,WScript.echo()方法将被替代。那么,没有第四种方法了吗?那好吧,我就这么说。谢谢问题是如何创建一个可变包装函数,将其所有参数传递给另一个函数。提示:下次试着先阅读整个问题。此外,您不能从外部覆盖另一个函数的参数
对象。