函数保存其外部的变量并且能够访问它们称之为闭包。在某些语言中,是没有闭包的,或是以一种特别方式来实现。但正如上面所说的,在 JavaScript 中函数都是天生的闭包(只有一个例外,请参考 “new Function” 语法)。
也就是说,他们会通过隐藏的
[[Environment]]
属性记住创建它们的位置,所以它们都可以访问外部变量。
1. 闭包
在我看来,函数与其外部词法环境的引用就构成闭包。闭包的核心是词法环境,词法环境由环境记录项和可能为空的外部词法环境引用构成。在执行环境创建的时候,就生成了类似环境链的数据结构,词法环境是彼此独立的,当前执行环境访问变量时,首先会先从当前词法环境里查找,没找到继续沿着外部词法作用域查找,直到词法环境链的末尾。
2. 实际运用
- 模拟私有方法
- 存储变量
- 循环中的闭包