javaScript中递归和arguments.callee

现在已经不推荐使用arguments.callee();
原因:访问arguments是个很昂贵的操作,因为它是个很大的对象,每次递归调用时都需要重新创建。影响现代浏览器的性能,还会影响闭包。

但是,arguments并非一无是处,arguments还是有优点的,如下:

arguments函数内部对象,包含传入函数的所有参数,arguments.callee代表函数名,多用于递归调用,防止函数执行与函数名紧紧耦合的现象,对于没

有函数名的匿名函数也非常起作用.

javaScript中递归和arguments.callee知识点

【JavaScript】arguments.callee的作用及替换方案

 arguments.callee的用法

callee和caller

arguments.callee

案例1

 

扫描二维码关注公众号,回复: 12956345 查看本文章

/*
现在已经不推荐使用arguments.callee();
原因:访问arguments是个很昂贵的操作,因为它是个很大的对象,每次递归调用时都需要重
新创建。影响现代浏览器的性能,还会影响闭包。
*/
console.log("***************************");

//一道面试题,接受参数n=5,不用for循环输出数组【1,2,3,4,5】
//这是用递归的思路,配合arguments.callee,代码如下
function show(n) {
	var arr = [];
	return (function() {
		arr.unshift(n);
		n--;
		if (n != 0) {
			arguments.callee();
		}
		return arr;
	})();
}

var result = show(5);
console.log(result); //[1, 2, 3, 4, 5]

//现在已经不推荐使用arguments.callee()
//改成如下:
function show2(n) {
	var arr = [];
	return (function fn() {
		arr.unshift(n);
		n--;
		if (n != 0) {
			fn(); //
		}
		return arr;
	})();
}

var result2 = show2(5);
console.log(result2); //[1, 2, 3, 4, 5]

console.log("***************************");

运行结果如下:

案例2

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

var r1 = factorial(5);
console.log("**A**", r1);

//同理,可以将上面的代码改成如下:
function myFactorial(num) {
	if (num <= 1) {
		return 1;
	}
	var myResult = 1;
	return (function fn() {
		myResult *= num;
		num--;
		if (num != 0) {
			fn();
		}
		return myResult;
	})();
}

var r2 = myFactorial(5);
console.log("**B**", r2);

运行结果如下:

完整代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>javaScript中递归和arguments.callee知识点</title>
<style type="text/css">
input[type=button] {
	background-color: #8E388E;
	border: 0px solid #8E388E;
	color: #fff;
	width: 160px;
	height: 40px;
	border-radius: 6px; /*把边框做成圆角*/
}

</style>
<script type="text/javascript">
/*
现在已经不推荐使用arguments.callee();
原因:访问arguments是个很昂贵的操作,因为它是个很大的对象,每次递归调用时都需要重
新创建。影响现代浏览器的性能,还会影响闭包。
*/
console.log("***************************");

//一道面试题,接受参数n=5,不用for循环输出数组【1,2,3,4,5】
//这是用递归的思路,配合arguments.callee,代码如下
function show(n) {
	var arr = [];
	return (function() {
		arr.unshift(n);
		n--;
		if (n != 0) {
			arguments.callee();
		}
		return arr;
	})();
}

var result = show(5);
console.log(result); //[1, 2, 3, 4, 5]

//现在已经不推荐使用arguments.callee()
//改成如下:
function show2(n) {
	var arr = [];
	return (function fn() {
		arr.unshift(n);
		n--;
		if (n != 0) {
			fn(); //
		}
		return arr;
	})();
}

var result2 = show2(5);
console.log(result2); //[1, 2, 3, 4, 5]

console.log("***************************");
//
function factorial(num) {
	if (num <= 1) {
		return 1;
	} else {
		return num * arguments.callee(num - 1);
	}
}

var r1 = factorial(5);
console.log("**A**", r1);

//同理,可以将上面的代码改成如下:
function myFactorial(num) {
	if (num <= 1) {
		return 1;
	}
	var myResult = 1;
	return (function fn() {
		myResult *= num;
		num--;
		if (num != 0) {
			fn();
		}
		return myResult;
	})();
}

var r2 = myFactorial(5);
console.log("**B**", r2);

</script>
</head>
<body style="background-color: #CCE8CF;">
<h1>javaScript中递归和arguments.callee知识点</h1>
<input type="button" value="字符串的slice()函数">
<div id="div1" style="background-color: Wheat; height: 100%;">
</div>
</body>
</html>

大家可以举一反三,触类旁通!

猜你喜欢

转载自blog.csdn.net/czh500/article/details/115273387