首页 » 编写高质量代码:改善JavaScript程序的188个建议 » 编写高质量代码:改善JavaScript程序的188个建议全文在线阅读

《编写高质量代码:改善JavaScript程序的188个建议》建议56:使用arguments模拟重载

关灯直达底部

在JavaScript中,每个函数内部可以使用arguments对象,该对象包含了函数被调用时的实际参数值。arguments对象虽然在功能上与数组有些类似,但它不是数组。arguments对象与数组的类似体现在它有一个length属性,同时实际参数的值可以通过操作符来获取,但arguments对象并没有数组可以使用的push、pop、splice等方法。其原因是arguments对象的prototype指向的是Object.prototype,而不是Array.prototype。

Java和C++语言都支持方法重载,即允许出现名称相同而形式参数不同的方法,但JavaScript并不支持这种方式的重载。这是因为JavaScript中的function对象也是以属性的形式出现的,在一个对象中增加与已有function同名的新function时,旧的function对象会被覆盖。不过可以通过使用arguments来模拟重载,其实现机制是通过判断arguments中实际参数的个数和类型来执行不同的逻辑。


function sayHello{

switch(arguments.length){

case 0:

return"Hello";

case 1:

return"Hello,"+arguments[0];

case 2:

return(arguments[1]=="cn"?"你好,":"Hello,")+arguments[0];

};

}

sayHello;//"Hello"

sayHello("Alex");//"Hello,Alex"

sayHello("Alex","cn");//"你好,Alex"


callee是arguments对象的一个属性,其值是当前正在执行的function对象。它的作用是使匿名function可以被递归调用。下面以一段计算斐波那契序列中第N个数的值的过程来演示arguments.callee的使用。


function fibonacci(num){

return(function(num){

if(typeof num!=="number")

return-1;

num=parseInt(num);

if(num<1)

return-1;

if(num==1||num==2)

return 1;

return arguments.callee(num-1)+arguments.callee(num-2);

})(num);

}

fibonacci(100);