变量的作用域
变量的作用域,即变量的有效范围。
- 当变量前面没有带上关键字var,该变量就会成为全局变量
- 如果是用var声明的变量,这个变量就是局部变量,只有在当前作用域才能访问
- 当前作用域没有找到该变量时,就会随着代码执行环境创建的作用域链往外层逐层搜索,一直搜索到全局对象为止
变量的生存周期
- 全局变量的生存周期是
永久的,除非我们主动销毁这个全局变量 - 函数内用var关键字声明的局部变量,当退出函数时,这些局部变量就会随着函数调用的结束而被销毁
- 但当局部变量被函数内部返回的函数所引用时,这样就形成了
闭包,这样即使函数调用结束,但由于内部返回函数可以访问到该局部变量,那么这个局部变量就不会被销毁
const func = function() {
let a = 1;
return function() {
a++
return a
}
}
const f = func();
console.log(f()); // 2
console.log(f()); // 3
闭包的作用
- 封装变量:可以帮助把一些不需要暴露在全局的变量封装成
私有变量 - 延续局部变量的寿命
闭包与内存管理
- 如果局部变量被封闭在闭包形成的环境中,那么这个局部变量就能一直生存下去,这些变量在闭包中和放在全局作用域,对内存方面的影响是一致的,如果需要回收,手动将变量置为null即可。
- 闭包容易造成内存泄漏的主要原因是,使用闭包的同时比较容易形成循环引用,如果两个对象之间形成了循环引用,那么这两个对象都无法被回收。如果闭包的作用域链中保存着一些DOM节点,就有可能造成内存泄漏。