作用域(scope)和作用域链
1.作用域
作用域其实就是一个变量的可用范围。js中有两级作用域:全局作用域 window
,函数作用域。
2.全局作用域
- 全局作用域
window
保存着全局变量。(其实作用域本质是一个对象,保存了当前所有变量)。 - 保存在全局作用域中的变量成为全局变量。
- 优点:可重复使用
- 确定:及易被篡改
3.函数作用域
-
保存着一个函数中所有的局部变量的对象
-
保存在函数作用域内的变量叫做局部变量
- 优点:仅在函数内可用,函数外部无法访问
- 缺点:不可重用
-
函数的生命周期
函数的生命周期分为三个阶段:创建阶段,执行阶段,销毁阶段
-
创建阶段:
只有函数对象,没有调用函数前,暂时没有函数作用域对象
-
执行阶段:
调用函数时,会为调用的函数临时创建 作用域对象,保存函数中的 局部变量(局部变量包括形参和在函数内var出的变量)函数内部要用到变量时,都是先自己局部中找,找不到才去上一级作用域中找。
-
销毁阶段:
函数调用后,会自动释放掉本次临时创建的函数作用域对象,其中的所有局部变量都会被一起释放掉。所以,函数作用域中的局部变量是不可重用的。
-
4. 作用域链
- 由多个作用域对象串联起来的链式结构就是作用域链
- 全局中的函数都有两级作用域一个是自己调用时临时创建的作用域对象,一个是全局的作用域对象window
- 当函数调用时,都是按照先函数作用域再全局作用域来使用变量的。