函数保存其外部的变量并且能够访问它们称之为闭包。在某些语言中,是没有闭包的,或是以一种特别方式来实现。但正如上面所说的,在 JavaScript 中函数都是天生的闭包(只有一个例外,请参考 “new Function” 语法)。

也就是说,他们会通过隐藏的 [[Environment]] 属性记住创建它们的位置,所以它们都可以访问外部变量。

1. 闭包

在我看来,函数与其外部词法环境的引用就构成闭包。闭包的核心是词法环境,词法环境由环境记录项和可能为空的外部词法环境引用构成。在执行环境创建的时候,就生成了类似环境链的数据结构,词法环境是彼此独立的,当前执行环境访问变量时,首先会先从当前词法环境里查找,没找到继续沿着外部词法作用域查找,直到词法环境链的末尾。

2. 实际运用

  • 模拟私有方法
  • 存储变量
  • 循环中的闭包