作用域与作用域链
作用域
作用域是根据名称查找变量的一套规则,作用域是在运行时代码中的某些特定部分中变量,函数的可访问性。换句话说,作用域决定了代码区块中变量和其他资源的可见性。
变量提升
块级作用域
词法作用域和动态作用域
作用域共有两种主要的工作模式。第一种是最为普遍的,被大多数编程语言所采用的词法作用域,另一种叫做动态作用域,如 Bash 脚本。
词法作用域
词法作用域是一套引擎如何寻找变量以及会在何处找到变量的规则。词法作用域最重要的特征是它的定义过程发生在代码的书写阶段(假设你没有使用 eval 或 with),即你写好后你的作用域就定了
JavaScript 并不具有动态作用域。它只有词法作用域,简单明了,但是 this 机制某种程度上很像动态作用域
主要区别:词法作用域是在写代码或者说声明时确定的,而动态作用域是在运行时确定的(this 也是!)
词法作用域关注函数在何处声明,而动态作用域关注函数从何处调用
作用域链
作用域链指的是作用域与作用域之间形成的链条。当我们查找一个当前作用域没有定义的变量(自由变量)的时候,就会向上一层作用域寻找,直到找到该变量,或抵达到全局作用域为止。
面试题
描述作用域与作用域链
作用域就是一个变量可使用的范围,换句话说作用域就是变量,函数的可访问性。作用域主要有两种工作模式静态作用域(词法作用域)和动态作用域,js与其他大多数语言一致,使用静态作用域。静态作用域在声明时确定,动态作用域在运行时确定,也就是说静态作用域关注在何处声明,而动态作用域关注在何处使用。这里,this的机制某种程度上很想动态作用域。作用域链就是作用域与作用域之间的形成的链条。内层作用域查找一个没有声明的变量时就会向外层查找直到全局作用域。
ES6新增了块级作用域,通过let,const声明。