每个函数中都有一个属性叫 arguments 用来包含所有传入的参数 这个对象还有一个属性叫 callee ,该属性是一个指针,指向拥有这个arguments对象的函数。
案例中 函数的执行与函数名factorial紧密的耦合在一起,要消除这种耦合现象,就要用到arguments.callee.
factorial [fækˈtɔːriəl] fai ke tuo rui ou 阶乘函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
/*
* 每个函数中都有一个属性叫 arguments 用来包含所有传入的参数 这个对象还有一个属性叫 callee ,该属性是一个指针,指向拥有这个arguments对象的函数。
* 案例中 函数的执行与函数名factorial紧密的耦合在一起,要消除这种耦合现象,就要用到arguments.callee。
* */
//不消除耦合现象,一旦函数后面定义了
// function factorial(num) {//递归算法
// if (num <= 1){
// return 1;
// }else {
// console.log(factorial);// return 0
// return num * factorial(num-1);
// }
// }
// let trueFactorial = factorial;
// factorial = function () {
// return 0;
// };
// console.log(trueFactorial(1));// 1
// console.log(trueFactorial(5));// 0
// console.log(factorial((5))); // 0
/*
ƒ factorial(num) {//递归算法
if (num <= 1){
return 1;
}else {
return num * factorial(num-1);
}
}
//定义的trueFactorial保存了前面定义的函数factorial,但是当代码执行到return num*factorial(num-1)时,factorial已经变成了return 0,所以返回0,这里取消耦合现象即可正常使用factorial函数
//下面的factorial函数又重新定义了,再调用factorial就会返回0,
ƒ () {
return 0;
}
*/
function factorial(num) {
if (num <= 1){
return 1;
}else {
return num * arguments.callee(num-1);
}
}
console.log(factorial(1));//1
console.log(factorial(2));//2 :2 * 1
console.log(factorial(5));//120 :5 * (4 * (3 * (2 * (1)))) = 120
let trueFactorial = factorial;
factorial = function () {
return 0;
};
console.log(trueFactorial(5));// 120
console.log(factorial(5));// 0
</script>
</body>
</html>