JavaScript中的闭包

51 阅读1分钟

闭包是什么?

闭包是 JS 的一种语法特性

闭包 = 函数 + 自由变量

对于一个函数来说,变量分为:全局变量、本地变量、自由变量



  let count
  function add (){ // 访问了外部变量的函数
    count += 1
  }

把上述代码放在一个函数中,并用return将function返回,这就是闭包,也就是把上述代码放在「非全局环境」里

const add2 = function (){
	var count
	return function add (){ // 访问了外部变量的函数
	  count += 1
	}
}()

使用场景

  1. 创建私有变量
  2. 延长变量的生命周期

解决了什么问题:

  1. 避免污染全局环境。(因为用的是局部变量)
  1. 提供对局部变量的间接访问。(因为只能 count += 1 不能 count -= 1)
  1. 维持变量,使其不被垃圾回收。

优点:

简单,好用。

缺点:

闭包使用不当可能造成内存泄露。

注意,重点是「使用不当」,不是闭包。

「闭包造成内存泄露」这句话以讹传讹很多年了,曾经旧版本 IE 的 bug 导致的问题,

function test() {
  var x = {name: 'x'};
  var y = {name: 'y', content: "-----这里很长,有一万三千五百个字符那么长----" }
  return function fn() {
    return x;
  };
}

const myFn = test() // myFn 就是 fn 了
const myX = myFn() // myX 就是 x 了
// 请问,y 会消失吗?

对于一个正常的浏览器来说,y 会在一段时间后自动消失(被垃圾回收器给回收掉)。

但旧版本的 IE 并不是正常的浏览器,所以是 IE 的问题。

注意事项

如果不是某些特定任务需要使用闭包,在其他函数中创建函数是不明智的,因为闭包在处理速度和内存消耗方面对脚本性能具有负面影响。