JavaScript函数内部属性arguments

本文深入探讨JavaScript函数内部的arguments对象特性,包括其作为数组的用途和callee属性的作用。通过实例展示了arguments对象如何在函数重载和解耦中发挥作用,并通过代码对比解释了在函数重写时如何保持递归调用的正常执行。

JavaScript高级程序设计(第三版),个人的读书笔记.

在JS函数内部,有两个特殊的对象:arguments和this,我们先讲下arguments。

arguments是一类数组对象,包含着输入函数中的所有参数。除此之外还有一个callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。

举一个阶乘的例子文件命名为factorial.js(在nodejs下检验js输出结果):

function factorial(num) {
	if(num <= 1) {
		return 1;
	}else{
		return num * factorial(num - 1);
	}
}

//同样效果的:
function factorial(num) {
	if(num <= 1) {
		return 1;
	}else{
		return num * arguments.callee(num-1);
	}
}

这种写法主要为了函数的解耦,重写的函数,无论引用函数时使用的是什么名字,都可以保证正常的完成递归调用。

看下面两段代码的执行结果:

//第一段代码
function factorial(num) {
	if(num <= 1) {
		return 1;
	}else{
		return num * factorial(num - 1);
	}
}

var trueFactorial = factorial;
factorial = function() {
	return 0;
}

console.log(trueFactorial(5));
console.log(factorial(5));

//运行结果是
//0
//0
变量trueFactorial获取了factorial值,实际上实在另一个位置上保存了一个函数的指针,然后我们又将简单的返回0的函数复制给factorial变量.所以在trueFactorial执行时,内部的factorial已经是被重写了.所以输出0 0结果~
//第二段代码
function factorial(num) {
	if(num <= 1) {
		return 1;
	}else{
		return num * arguments.callee(num-1);
	}
}

var trueFactorial = factorial;
factorial = function() {
	return 0;
}

console.log(trueFactorial(5));
console.log(factorial(5));

//运行结果是:
//120
//0

函数只是会调用自身,后面的变量复制的函数不会去覆盖掉factorial的中的调用,所以运行结果是我们想要的.



转载于:https://my.oschina.net/alexskywinner/blog/224076

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值