开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第25天,点击查看活动详情
递归
如果一个函数在内部可以调用其本身,那么这个函数就是递归函数
function fn(n) {
fn()
}
console.log(fn()); //报错
//上面代码报错因为递归很容易发生“栈溢出”错误(stack ),所以必须要加退出条件 return
从这里我们就可以知道递归是由两个部分组成的,递归调用的过程和递归终止的条件,要注意的是在递归中必须有限制条件,不然会无终止地自身调用,因此,在递归运算中要结合 if 语句进行控制,只有在某个条件成立时才允许执行递归,否则不允许调用自身
function fn(n) {
if (n < 0) {
return '不符合,请先出去'
} else if (n == 0 || n == 1) {
return 1;
}else if (n > 1) {
return fn(n - 1) + fn(n - 2)
}
}
console.log(fn(5))
预编译
- 检查通篇的语法错误
- 预编译的过程
- 解释一行,执行一行
console.log(a); //语法错误
console.log(a);
console.log(a);
下面说几个现象
//同样可以执行
test()
function test() {
console.log(1)
}
//在前面声明和后面声明都一样
console.log(a); //undefined
var a;
上面两个例子总结一下:函数声明整体提升,变量只有声明提升,赋值是不提升
暗示全局变量 imply global variable
a = 1;
console.log(a); //1
var a = 1;
console.log(a); //1
当a声明或者没有声明的时候都打印出了1,看着没什么区别,但这里就存在的全局变量的问题,都存在了全局变量window里面,上面可以这样认为 a == window.a
test函数调用后,会将b变量提升为全局变量
function test() {
var a = b = 1;
}
test();
console.log(b);
两种不同的访问方式,导致不同的输出结果
function test() {
var a = b = 1;
}
test();
console.log(a); // 抛错,ReferenceError: a is not defined
console.log(window.a); // undefined ,即访问一个对象里不存在的值