作用域、作用域链、闭包

141 阅读1分钟

简单来说,作用域 指程序中定义变量的区域,它决定了当前执行代码对变量的访问权限。

首先,js有一个预编译过程,在JS代码执行前,会先创建一个全局上下文GO,在函数执行前,会有一个函数的预编译也叫函数上下文AO,作用域链就是把GO,AO形成链式从上到下排列起来,在一个函数被定义的时候,系统会生成一个scoped属性,scoped保存了该函数的作用域链

1.在函数还没被执行之前,作用域链的第0位就是储存当时环境下的全局上下文GO。 2.在函数执行时,第0位就变成了该函数的AO。 3.一般函数执行完毕,AO就会自动消除。

而闭包就是,如果函数返回了这个函数声明的变量或者函数,外界对这个函数的引用导致函数的作用域(AO)无法被释放,就形成了闭包。

典型的闭包是一个函数A内声明并返回一个函数B供外部使用,函数B内用到了A内部的局部变量或者形参。外界对A函数内变量的引用导致A作用域不能被释放,构成一个闭包。