闭包及原理
概念
一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。大白话也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域
function fn() { var a = 10 return function getData() { return a } } var getData = fn() var a1 = getData()
原理
闭包的原理就是利用作用域链的特性,首先在当前作用域访问数据,当前作用域访问不到,则向父级访问,父级也没有,一直找到全局。
作用
数据私有化,防止污染全局
var a = 10 function fn() { console.log(a) } console.log(a)
将闭包代码修改后也同样可以访问到 a 数据,但是此时 a 的数据在全局,全局可以直接对 a 数据进行修改,而且全局也多了一个 a 这个数据,要尽量避免直接将数据直接放到全局
缺点
闭包会造成内存泄漏,因为闭包的数据没有被回收
function fn() { var a = 10 return function getData() { return a } } var getData = fn() var a1 = getData()
解决方案:将全局指向的函数重新置为 null,利用标记清除的特性
function fn() { var a = 10 return function getData() { return a } } var getData = fn() getData = null