闭包是指一个函数通过隐藏的 [[Environment]] 属性,持有对其创建时词法环境的引用,从而在被调用时(无论在哪里调用)仍然能访问并操作那个词法环境中的变量。
ps: [[Environment]] 不是词法环境,词法环境= 环境记录+外部环境的引用,[[Environment]] 只是函数中的一个隐藏的属性,该属性保存了对创建该函数的词法环境的引用,可以理解为就是词法环境中的‘外部环境的引用’,因为:[[Environment]] 是函数身上的指针,指向出生时的词法环境;调用时,它的值被复制给新词法环境的外部引用,之后的变量查找沿外部引用链进行,[[Environment]] 本身不参与查找。
ps:执行上下文= 词法环境 + this 绑定 + 其他,执行上下文是更大的概念,词法环境是它的一部分