【JavaScript】函数的arguments

函数的arguments

什么是arguments

arguments的实质就是一个类数组对象,没有数组上的方法,是函数的一个内置对象,它包含了调用函数时传入的所有参数。

并且这个对象只有以function关键字定义的函数时才会有,箭头函数语法创建的函数是无法使用的。

当我们不确定有多少个参数的时候,可以用argument来获取

arguments上的属性

  • 具有数组的length属性
function fn() {
    	//输出的是传递参数的个数  
    	console.log(arguments.length); // 3 
	}
fn(543,645,657);
  • 按照索引的方法进行存储,并且可以通过索引方式修改参数
function fn() {
    	console.log(arguments[1]); // 645
    	// 按照数组的方法对arguments进行遍历
    	for (let i = 0; i < arguments.length; i++) {
    	    console.log(arguments[i]); 
            // 543,
           	// 645
            // 657
    	}
        arguments[0] = 666
    	arguments[1] = 777
    	arguments[2] = 888
    	for (let i = 0; i < arguments.length; i++) {
        	console.log(arguments[i]);
            // 666
            // 777
            // 888
    	}
	}
fn(543,645,657);

arguments中的callee属性

callee属性是一个指向arguments对象所在函数的指针。

用经典的阶乘函数来举例

//常规写法
function factorial(num) {
    if (num <= 1) {
        return 1
    } else {
        return num * factorial(num - 1)
    }
}
===============================================
//使用argument.callee
function factorial(num) {
    if (num <= 1) {
        return 1
    } else {
        return num * arguments.callee(num - 1)
    }
}

在上述代码中arguments.callee代替了factorial函数,这样做的好处是让函数逻辑与函数名解耦.这也就意味着,无论函数叫什么名字,都可以正确引用函数

function factorial(num) {
    if (num <= 1) {
        return 1
    } else {
        return num * arguments.callee(num - 1)
    }
}

let tempFactorial = factorial

factorial = function () {
    return 0
}

console.log(tempFactorial(5)); //120
console.log(factorial(5)); // 0

这里,tempFactorial变量被赋值为 factorial,实际上把同一个函数的指针又保存到了另一个位置。然后,factorial 函数又被重写为一个返回 0的函数。如果像 factorial()最初的版本那样不使用arguments.callee,那么像上面这样调用 trueFactorial()就会返回0。不过,通过将函数与名称解耦,trueFactorial()就可以正确计算阶乘,而 factorial()则只能返回0。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值