js的作用域和作用域链以及执行环境

以下都是自己瞎理解的,如有不对欢迎指出!

什么是作用域?
在你不知道的javaScript中是这样解释的:负责收集并维护由所有声明的标识符(变量)组成的一系列查 询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。

我认为就是当你声明一个变量,你需要一个容器去保存那个变量的引用,这容器就需要制定规则,去决定记录哪些变量,决定别人如何去获取容器中的变量甚至对它进行修改。而这个容器就是作用域。
作用域分为两种,一种是全局作用域和函数作用域。

什么是执行环境?
在红包书中解释:执行环境(execution context)是js中最为重要的一个概念,执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为;

可能我境界不够吧,没明白它和作用域的区别。接下来我就自我意淫推敲一下

我是这样理解的,执行环境字面意思也就是代码已经开始执行,代码中可能存在多个作用域。js是如何区分和联系的呢?我认为就是通过执行环境,执行环境就制定了代码当前该存储到哪个作用域,该访问哪个作用域。

红宝书中又提到每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中。而在函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境。ECMAScript 程序中的执行流正是由这个方便的机制控制着。

这让更加确定执行环境是在代码执行中起效果的。

而红宝书中对作用域链的概念:
当代码在一个环境中执行时,会创建变量对象的一个作用域链,保证对执行环境有权访问的所有变量和函数的有序访问

说明执行环境就是来组织作用域的,代码可以通过作用域链来对不同作用域的变量进行访问和修改。
作用域链的前端是当前代码活动的执行环境,而末端就是window。

var a = 10
function run () {
  function run2() {
    console.log(a)  
  }
}
// 当执行环境处于run2时,作用域链为run2=>run=>window
// 查询规则就是从当前作用域链前端一直查询到window,当中间某个作用域存在的话,就会停止查询

我这里在延伸一下闭包

var res = run()
res()
function run() {
      var a = 10
      var func = function () {
        console.log(a)
      }
      return func 
}

首先代码会进行预编译,变量res会提前声明,函数run会提前编译出来
在全局执行环境下也就是window。开始执行代码
res进行赋值操作run()
run函数,进入函数自己的执行环境
run函数内部返回另一个函数func() 又进入func的执行环境
这时作用域链就是func=>run=>window
赋值操作结束,这时res的调用结果中a就会使用上面这条作用域链的规则去查找数据

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容