一个函数和其词法环境的组合就是闭包。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。

词法环境(lexical environment)由两个部分组成:

  1. 环境记录——一个存储所有局部变量作为其属性的对象。
  2. 对外部词法环境的引用,与外部代码相关联。

全局词法环境在脚本执行前创建,它没有更外层的词法环境。

  1. // 全局词法环境
  2. let a = 'hello' // => hello
  3. let b // => undefined
  4. b = 'world' // => world

ab作为环境记录这一对象的属性,它们被声明时就被赋予值或在之后的过程中被赋予值。

  1. let who = '小明'
  2. function say(content) {
  3. let date = new Date()
  4. alert(`${who}说:${content} | at ${date}`)
  5. }
  6. say('你好,世界!')

say()函数能够构成一个词法环境,因为函数引用了外部词法环境(也就是环境记录的属性who)。say()函数访问外部词法环境时,首先会搜索内部词法环境,然后搜索外部词法环境,然后搜索更外部的词法环境,以此类推,直到全局词法环境。

一个函数和其词法环境的组合就是闭包。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。ps:该定义被简化,原话在闭包 – JavaScript | MDN

  1. function count() {
  2. let record = 0
  3. return function f() {
  4. return record++
  5. }
  6. }
  7. let counter = count()

f()函数和其词法环境是一个闭包,或者将视野往上看,count()函数的作用域下就是一个闭包,内层函数f()在闭包的作用下,可以访问外层函数的作用域内的任何局部变量。

版权声明:本文为shiramashiro原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/shiramashiro/p/15059599.html