美文网首页
JS进阶系列之作用域链

JS进阶系列之作用域链

作者: McRay | 来源:发表于2017-06-15 15:02 被阅读0次

在之前写的进阶系列里面,提到了执行上下文在创建阶段,要创建变量对象确定作用域链还有确定this的指向,本次将重点讲解一下作用域链

JavaScript代码的执行过程

在讲解作用域链之前,首先了解一下,JavaScript代码的执行过程,包括两个步骤:

  • 编译阶段
  • JavaScript引擎执行阶段
image.png

在编译阶段主要做的是,经过编译器的编译,将代码转化为可执行的代码,其中就包括了作用域规则的确定,而在之前说的执行上下文的创建和执行阶段是发生在JavaScript隐引擎执行阶段,所以作用域链是在执行上下文创建阶段才产生的,这时候,可能你会疑惑,作用域和作用域链有什么区别呢?

什么是作用域?

作用域为一套规则,用来管理引擎如何在当前作用域以及嵌套的子作用域中根据标识符查找变量。

在JavaScript中,主要的作用域有两种:

  • 全局作用域
  • 函数作用域

什么是作用域链?

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

而作用域与作用域链的区别主要在于:

作用域是一套规则,作用域链是作用域的具体实现。

讲理论可能有些空洞,那么我就举个具体的例子来说明什么是作用域链吧

demo01
var a = 20;
function test(){
        var b = a + 20;
        function innerTest(){
             var c = 10;
             return b + c;
       }
       return innerTest();
}
test();

在这个例子中,按照之前讲解的

  • 先创建执行上下文,按照,globalEC—>testEC—>innerTestEC的顺序,压入调用栈中,其中主要讨论innerTest()的作用域链。
  • 按照作用链的定义,可以得出innerTest()执行上下的结构,如下
innerTestEC = {
      VO:{ c:10},
      scopeChain:[VO(innerTest),VO(test),VO(global)],
      this:{...}
}

可以看出,innerTest()的作用域链就是由当前的执行环境与上层的执行环境中的一系列变量对象组成,所以innerTest()就能访问到上层执行上下文中,变量对象中的属性和方法,这就是作用域链。

  • 看一下innerTest()的作用域链图,如下:
image.png

相关文章

  • JS进阶系列

    在JS入门难点解析系列中,我们对JS的一些重要概念,比如:作用域,作用域链,原型,原型链,继承,活动对象,this...

  • JS进阶系列之作用域链

    在之前写的进阶系列里面,提到了执行上下文在创建阶段,要创建变量对象、确定作用域链还有确定this的指向,本次将重点...

  • javascript的执行上下文—作用域链 闭包

    js作用域:函数作用域、全局作用域作用域链:由当前环境与上层环境的一系列变量对象组成,它保证了当前执行环境对符合访...

  • 干货!月薪80k前端大佬面试笔记:JS闭包解析!

    三点注意事项 JS没有块级作用域,只有全局作用域和局部作用域(函数作用域)。 JS中的作用域链,内部的作用域可以访...

  • JS 作用域链、导入导出

    1. JS 的作用域链 作用域在 JS 中表示变量的可访问性和可见性。JS 作用域有 3 种:1. 全局作用域;2...

  • 闭包

    一、理解闭包前js基础1、作用域链(作用域、作用域链中有说)。2、js的内存回收机制。一个函数在执行开始的时候,会...

  • 作用域和作用链

    关键词:作用域作用链 作用域 js中没有块级作用域 全局作用域,函数作用域太简单,就不演示(≧▽≦)/啦啦啦 作用...

  • 作用域链简介

    每一段js代码(全局代码或函数)都有一个与之关联的作用域链(scope chain)。 这个作用域链是一个对象列表...

  • 2018-12-18

    JS高级 作用域&作用域链 作用域: 1.作用域的个数:n(函数声明的个数)+1(全局作用域)2.作用域不会存储变...

  • 浅谈JS作用域链

    浅谈JS作用域链 作用域 作用域(scope)就是变量访问规则的有效范围。作用域外,无法引用作用域内的变量;离开作...

网友评论

      本文标题:JS进阶系列之作用域链

      本文链接:https://www.haomeiwen.com/subject/eczyqxtx.html