Recursión y argumentos.callee en javaScript

Ahora está en desuso el uso de argumentos.callee ();
razón : acceder a los argumentos es una operación muy costosa porque es un objeto muy grande y necesita ser recreado cada vez que se llama de forma recursiva. Afecta el rendimiento de los navegadores modernos y también afecta a los cierres.

Sin embargo, los argumentos no son inútiles, los argumentos todavía tienen ventajas, como sigue:

argumentos a un objeto interno de la función que contiene todos los parámetros pasados ​​a la función, argumentos.callee en nombre del nombre de la función , utilizado para llamadas recursivas para evitar que la función realice el nombre de la función acoplando estrechamente los fenómenos, no para

Las funciones anónimas con nombres de funciones también son muy útiles.

Puntos de conocimiento de recursividad y argumentos.callee en javaScript

[JavaScript] El rol y reemplazo de los argumentos.

 Uso de argumentos.

llamar 和 llamador

argumentos.callee

Caso 1

 

/*
现在已经不推荐使用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("***************************");

Los resultados de la operación son los siguientes:

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

Los resultados de la operación son los siguientes:

El código completo es el siguiente:

<!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>

¡Pueden sacar inferencias unos de otros y aprender por analogía!

Supongo que te gusta

Origin blog.csdn.net/czh500/article/details/115273387
Recomendado
Clasificación