基础知识

函数声明提升

1
2
3
4
functionA();
function functionA() {
console.log("Hi!")
}

在执行代码之前会先读取函数声明,所以说函数声明语句可以放在调用函数语句的后面。

声明函数还有另外一种方式,叫做函数表达式

1
2
3
let functionA = function () {
// 函数体
};

这种声明的函数叫做匿名函数,也叫做拉姆达函数

递归

1
2
3
4
5
6
7
8
9
10
11
12
function factorial(num) {
if(num <= 1) {
return 1;
} else {
return num * factorial(num-1);
}
}

let otherFactorial = factorial;
factorial = null;

console.log(otherFactorial(5)); // 报错

这是为什么报错呢?因为,我们将factorial函数体内容给了otherFactorial了,并且将factorial指向为空,当调用该函数的时候,必须要调用factorial才能完成递归过程,所以factorial并不存在了,所以导致了报错。

那我们可以通过什么途径解决呢?可以使用arguments.callee()来获取正在执行的函数的指针。

1
2
3
4
5
6
7
function factorial(num) {
if(num <= 1) {
return 1;
} else {
return num * arguments.callee(num-1);
}
}

在严格模式下arguments.callee是无法使用的,可以使用下面命名函数的方式代替。

1
2
3
4
5
6
7
let factorial = ( function f(num) {
if(num <= 1) {
return 1;
} else {
return num * f(num-1);
}
});

评论