JavaScript的arguments 对象使用总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31851435/article/details/53112876

arguments 对象是当前函数的一个内置属性,只能在其关联函数的范围内直接进行访问

当 arguments 对象开始执行时,它会为每个函数进行实例化。 

使用 arguments 对象可以创建可接受任意个参数的函数,这一功能还可以通过在定义函数时使用参数数组结构来实现。


一、在函数代码中,使用特殊对象 arguments,我们无需明确指出参数名,就能访问它们

例如,在函数 sayHi() 中,第一个参数是 message1,用 arguments[0] 也可以访问这个值,即第一个参数的值(第一个参数位于位置 0,第二个参数位于位置 1,依此类推)。

function sayHi(message1, message2){
   // 判断函数传入的第一个参数的值
   if(arguments[0] == "xx1"){
      return;
   }
   alert(arguments[0]);
}
sayHi("xx2"); // 弹出xx2


二、传递到函数的所有参数和参数的数目都存储在arguments对象中,用 arguments 对象检测函数的参数个数,引用属性 arguments.length。arguments对象的长度是由实参个数决定的,不是形参个数决定的(形参是函数内部重新开辟内存空间存储的变量,但是其与arguments对象内存空间并不重叠)

function test(){
   alert(arguments.length); // 输出传入函数的参数个数
}

test(); // 输出0
test("2") // 输出1
test("1","ww","2"); // 输出3

注:
与其他程序设计语言不同,JS不会验证传递给函数的参数个数是否等于函数定义的参数个数。开发者定义的函数都可以接受任意个数的参数(根据 Netscape 的文档,最多可接受 255 个),而不会引发任何错误。任何遗漏的参数都会以 undefined 传递给函数,多余的函数将忽略。


三、用 arguments 对象判断传递给函数的参数个数,模拟函数重载

function test(){
   if(arguments.length == 0){
      alert("没有参数");
   }else if(arguments.length == 1){
      alert("1个参数");
   }else if(arguments.length > 1){
      alert("多个参数");
   }
}

test(); // 输出"没有参数"
test(“xx”); // 输出"一个参数"
test("ww",1); // 输出"多个参数"


四、把arguments对象转换成一个真正的数组,含有一个函数所有参数的标准javascript数组对象(arguments 对象不是数组,但访问各个参数与访问数组元素的方式相同,要使用 [ ] 符号)

var argsArr = Array.prototype.slice.call(arguments);


五、caller和callee的区别

1.callee

callee是arguments对象的一个属性,返回的是正在执行的函数本身的引用

该属性仅当相关函数正在执行时才可用

在使用函数递归调用时推荐使用arguments.callee代替函数名本身

function count(n) {
   if (n <= 0){
      return 1;
   }else{
      return n * arguments.callee(n - 1);
   }
}

alert( count(4) ); // Output: 24   4*3*2*1*1

2.caller

functionName.caller: functionName是当前正在执行的函数的函数名

返回一个对函数的引用,该函数调用了当前函数

caller 属性只有当函数正在执行时才被定义 

如果函数是从 JScript 程序的顶层调用的,则 caller 包含 null

如果在字符串上下文中使用 caller 属性,则其结果和 functionName.toString 相同,就是说,将显示函数的反编译文本

function call()
{
    if (call.caller == null){
        console.log("call函数是从顶层调用的");
	console.log(call.caller);
    }else
    {
        console.log("call函数被调用:");
        console.log(call.caller);
    }
}

function testCall()
{
    call();
}

// 顶层调用call函数
call(); // 输出:null 

// 通过其他函数调用call函数
testCall();	// 输出:function testCall(){call();}



猜你喜欢

转载自blog.csdn.net/qq_31851435/article/details/53112876
今日推荐