JavaScript函数内部属性arguments

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

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

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

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

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);
	}
}

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

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

//第一段代码
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的中的调用,因此运行结果是咱们想要的. 指针

相关文章
相关标签/搜索