4. 作用域链与闭包

作用域

在JavaScript中,我们可以将作用域定义为一套规则,这套规则用来管理引擎如何在当前作用域以及嵌套的子作用域中根据标识符(即变量名或者函数名)名称进行变量查找。

作用域与执行上下文是完全不同的两个概念。
代码执行过程的两个阶段:
编译阶段由编译器完成,将代码翻译成可执行代码,这个阶段作用域规则会确定。
执行阶段由引擎完成,主要任务是执行可执行代码,执行上下文在这个阶段创建。

作用域链

作用域链是在执行上下文的创建阶段生成的。作用域链是作用域这套规则的具体实现。

作用域链,是由当前环境与上层环境的一系列变量对象组成,它保证了当前执行环境对符合访问权限的变量和函数的有序访问。

作用域链是由一系列变量对象组成,在这个单向通道中,可以查询变量对象中的标识符,就能访问到上一层作用域中的变量了

闭包

闭包与作用域链息息相关;
闭包是在函数执行过程中被确认。

当函数可以记住并访问所在的作用域(全局作用域除外)时,就产生了闭包,即使函数是在当前作用域之外执行。

简单来说,假设函数A在函数B的内部进行定义了,并且当函数A在执行时,访问了函数B内部的变量对象,那么B就是一个闭包。

通过闭包,我们可以在其他的执行上下文中,访问到函数的内部变量。

原文戳这里
原文实例戳这里

你可能感兴趣的:(4. 作用域链与闭包)