作用域 就是一个变量可以生效的范围, 变量不是在所有地方都可以使用的,而这个变量的使用范围就是作用域
全局作用域是最大的作用域
- 在全局作用域中定义的变量可以在任何地方使用
- 页面打开的时候,浏览器会自动给我们生成一个全局作用域 window
- 这个作用域会一直存在,直到页面关闭就销毁了
局部作用域就是在全局作用域下面又开辟出来的一个相对小一些的作用域
- 在局部作用域中定义的变量只能在这个局部作用域内部使用
- 在 JS 中只有函数能生成一个局部作用域,别的都不行
- 每一个函数,都是一个局部作用域
在函数内部,省略关键字var定义的变量是"全局变量"。
注意:var关键字尽量别省略,省略后"全局变量"和"局部变量"容易搞混淆。
有了作用域以后,变量就有了使用范围,也就有了使用规则
- 变量使用规则分为两种,访问规则 和 赋值规则
- 先在当前作用域找,找到就使用当前作用域找到的
- 如果当前作用域中没有找到,就去上一级作用域中查找
- 以此类推直到全局作用域为止,如果全局作用域还没找到,就报告错
递归函数
函数定义好之后,不能自已执行,需要使用函数调用语句调用才会执行,
函数调用语句一般写在函数体外面,但如果将函数调用语句写在函数体中,
也就是在一个函数内部,调用自己,这种函数称为递归函数:
上面递归函数 一旦执行,会循环往复,没有止尽。
需要给递归函数设置递归结束条件。 不然就是一个没有尽头的递归函数,我们叫做 死递归
实现递归
1. 函数自身调用自身
function fn(){
fn()
}
2. 结束递归条件
function fn(n){
if(n == 1){
return 1
}
}
3. 前后关系,后面结果与前面值关系
例如:
1 + 2 + 3 + 4 + 5 = ?
f(5) = f(4)+5↑
=> f(3)+4↑
=> f(2)+3 ↑
=> f(1)+2 ↑
1 ↑
f(n) = f(n-1) + n
栈区域(stack)
堆区域(heap)