作用域链
- 什么是作用域链?
- 每个执行上下文的变量环境中,都包含了一个外部引用,用来指向外部的执行上下文,我们把外部引用称为outer。
- JS引在执行全局上下文中查找,这个查找的链条就是被称为作用域链。
- 什么是词法作用域?
- 词法作用域是指作用域是由代码中函数声明的位置来决定的,所以词法作用域是静态的作用域,通过它就能够预测代码在执行过程中如何查找标识符。
- 词法作用域是代码编译阶段就决定好的,和函数怎么调用没关系。
- 块级作用域中变量查找:块级作用域内词法环境——>块级作用域变量环境——>全局执行上下文中的词法环境——>全局执行上下文中的变量环境。
闭包(使用不正确会造成内存泄漏)
- 根据词法作用域规则,内部函数总是可以访问他们的外部函数中的变量。当通过调用一个外部函数返回一个内部函数后,即该外部函数执行结束后,内部函数引用外部函数的变量依旧存在内存中,我们把这些变量的集合称为闭包。
- 闭包的使用:当前函数的执行上下文——>外部函数闭包——>全局执行上下文的顺序来查找变量。
- 闭包造成内存泄漏:如果引用闭包的函数是一个全局变量,那么闭包会一直存在知道页面关闭,如果这个闭包以后不在使用,就会造成内存泄漏。
- 引用闭包的函数是哥局部变量:等函数销毁后,下次JS引擎执行垃圾回收时,判断闭包这块内容不在使用,那么JS引擎的垃圾回收器就会回收这块内存。
- 闭包的正确使用:如果该闭包会一直使用,那么它可以作为全局变量而存在;但如果使用频率不高,而且占用内存又比较大,那就进来让它成为一个局部变量。
- 小结:JS的作用域链是由词法作用域决定的,而词法作用域是由代码结构来确定的。