本文详细解析JavaScript中arguments对象的特性。它虽类似数组却非数组实例,长度由实参决定。文章探讨了形参与arguments的同步机制,解释为何JS函数不支持重载,并介绍利用arguments.callee进行递归调用的最佳实践。
arguments对象的基本特性
在JavaScript中,arguments是一个特殊的内置属性,属于当前执行函数的内部对象。尽管它看起来非常像Array,但实际上并不是Array的实例。可以通过相关代码验证这一点(注:在函数funcArg内部,直接引用arguments即可,无需写成funcArg.arguments)。
Array.prototype.testArg = "test";
function funcArg() {
alert(funcArg.arguments.testArg);
alert(funcArg.arguments[]);
}
alert(new Array().testArg); // result: "test"
funcArg(); // result: "undefined" ""
实参与形参的内存关系
arguments对象的length属性由实际传入的参数个数决定,而非函数定义时的形参个数。形参是函数内部单独开辟内存空间的变量,与arguments对象的内存空间并不重叠。当arguments和形参都有值时,修改形参会同步更新arguments中的对应值;但若某参数未传值,则两者之间不会发生同步。相关代码验证如下。
function f(a, b, c){
alert(arguments.length); // result: ""
a = ;
alert(arguments[]); // result: ""
arguments[] = "qqyumidi";
alert(a); // result: "qqyumidi"
alert(c); // result: "undefined"
c = ;
alert(arguments[]); // result: "undefined"
}
f(, );
JavaScript函数重载的限制
基于JavaScript函数的声明与调用机制,可以得出结论:JavaScript原生不支持函数重载。
参照其他语言中函数重载的依据(即“函数返回值类型不同或形参个数不同”),我们可以推导出上述结论:
首先,JavaScript函数的声明语法中并不包含返回值类型的定义;
其次,JavaScript中的形参个数在严格意义上仅是为了方便函数内部的变量操作,实际上所有传入的参数都已存储在arguments对象中。
此外,从JavaScript函数的本质深入理解为何不支持重载:在JavaScript中,函数本身也是对象,函数名是指向该函数的引用,或者说函数名本质上是一个变量。对于以下所示的函数声明与函数表达式(暂不考虑两者区别),它们的效果是一致的,这有助于理解JavaScript中函数无法重载的特性。
function f(a){
return a + ;
}
function f(a){
return a - ;
}
// 在不考虑函数声明与函数表达式区别的前提下,其等价于如下
var f = function(a){
return a + ;
}
var f = function(a){
return a - ;
}
利用callee进行递归调用
arguments对象中包含一个非常有用的属性:callee。arguments.callee返回当前arguments对象所关联的函数引用。在编写递归函数时,推荐使用arguments.callee代替直接使用函数名,以提高代码的健壮性。
示例如下:
function count(a){
if(a==){
return ;
}
return a + arguments.callee(--a);
}
var mm = count();
alert(mm);
以上内容介绍了JavaScript中arguments对象的核心特性,希望对读者有所帮助。如果在参考过程中有任何疑问,欢迎留言,小编会及时回复。感谢大家对本站的支持!