什么是作用域?
英文名:Scope,一个变量的可用范围,专门保存变量的对象。
js中的两级作用域
1.全局作用域:
程序的任何地方都属于全局范围;
保存着所有的全局变量,可以在全局中被使用(没有被局部作用域的变量覆盖)。2.函数作用域:
仅在函数内的范围成为这个函数的作用域。
保存着函数内声明的变量,局部变量只能在函数内使用;
注意:javascript中没有块级作用域
作用域链
每个函数在创建时,都有一个属于自己的作用域链;
这个作用域链保存了一个函数可用的所有作用域和变量,控制着变量的使用顺序,先函数内后全局–就近原则。
闭包
1.函数内嵌套函数;
2.外层函数把内存函数返回到外层函数外部;
3.函数的内部参数和变量不会被垃圾回收机制回收。
形成的原因:外层函数调用后,外层函数的作用域对象被内层函数的作用域链引用着,无法释放,从而产生了闭包。
优点:保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突;
缺点:被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null;