zoukankan      html  css  js  c++  java
  • Javascript高级编程学习笔记(9)—— 执行环境

    今天主要讲一下,JS底层的一些东西,这些东西不太好举例(应该是我水平不够)

    望大家多多海涵,比心心

     

    执行环境

    执行环境(执行上下文,全文使用执行环境 )是JS中最为重要的一个概念,执行环境决定了,变量或函数有权访问的其他数据,并决定了其各自行为。

    跟执行环境直接相关的是变量对象 

    JS在执行环境中定义的所有变量和函数都保存在该对象上。

    对于该对象,我们无法使用代码来进行访问,但是JS解析器在进行数据处理时会在后台对该变量对象进行访问。

    全局执行环境

    全局执行环境是JS代码的最外围的执行环境,在JS脚本执行时创建,脚本执行完成后销毁

    全局执行环境根据宿主环境(即JS的运行环境)的不同而有所区别

    在web浏览器中全局执行环境被认为是window对象,所以所有的全局变量、函数都是作为window对象的属性和方法创建的(Es6中的 let、const声明的变量不会作为window对象的属性和方法)

    执行环境中的所有代码执行完成后保存在其中的所有变量、函数定义也都会随之销毁。

    这也是this指针默认的指向

    函数执行环境

    每次进行函数的调用时,都会为该函数创建一个新的执行环境,然后JS会执行该执行环境的代码,具体规则一会儿讲述。

    Eval函数执行环境

    Eval函数可以让JS开发人员动态地生成,并执行脚本,传入一个字符串后,会被该函数解析为可执行的JS代码,并执行

    关于上述的执行环境的执行顺序就涉及到了另一个概念

    执行栈

    执行栈在其它的编程语言中通常被称为调用栈,执行栈中保存了代码执行期间创建的所有执行环境

    学过数据结构的朋友应该知道,栈是一个后进先出的结构

    执行环境的执行顺序如下:

    1.当JS引擎首次读取JS脚本时会创建全局执行环境,并将全局执行环境推入执行栈

    2.每当函数被调用时,创建的函数执行环境会被推入执行栈,成为执行栈 的栈顶元素,执行栈移交控制权给该执行环境

    3.JS引擎会运行执行栈中栈顶的执行环境中的代码

    4.执行栈弹出已执行完的执行环境,将控制权交给目前栈顶的执行环境

    5.弹出全局执行环境,浏览器关闭

    我已经介绍了JS是如何管理执行环境的

    下面我将介绍JS是如何创建执行环境的

    创建执行环境

    1. 创建阶段
      1. 确定this的值,也被称为This Binding
        • 全局执行环境中,this指向全局对象
        • 浏览器中全局对象为window
        • 函数执行环境中,this的值取决于函数的调用方式,如果被一个对象引用调用,this会指向该对象,否则this会设为全局对象或undefined(严格模式)
      2. 词法环境被创建
        • 词法环境是一种规范类型,代码的词法嵌套结构来定义标识符与特定变量和函数关联关系
        • 即词法环境定义了标识符(变量名)和实际变量对象的映射关系(即JS是怎样通过变量名访问到数据的
        • 词法环境有两个组成部分:
          1. 环境记录(储存变量和函数声明的实际位置)
            • 声明性环境记录(储存变量、函数、参数 ;函数词法环境包含该类记录)
            • 对象环境记录(储存全局环境中出现的函数和变量的关联 ; 全局词法环境包含该类记录)
          2. 对外部环境引用(用于访问外部的词法环境
        • 词法环境有两种类型:
          1. 全局环境(没有外部词法环境,为null)
          2. 函数环境(保存在函数中定义的变量)
        • PS.对于函数环境而言,环境记录中包含了一个arguments 对象(是一个类数组对象)在上一篇文章中有着其较为详细的说明  
      3. 变量环境被创建
        • 也是一种词法环境,包含词法环境所有的属性用于存储 函数声明、变量绑定
        • 在ES6中 使用 LexicalEnvironment(词法环境) 来储存(let、const)
        • VariableEnvironment (变量环境) 组件存储(var)
      • PS . JS中的变量提升正是变量环境引起的,在创建阶段函数声明被存储在环境中,变量被设置为undefined(由于创建阶段在执行阶段之前)所以var 声明的变量在声明之前就可以访问,其值为变量环境设置的undefined 
    2. 执行阶段
      •   这一阶段就很好理解了,在这一阶段完成对变量的初始化,然后执行代码
      •        PS. 如果JS在代码中的环境记录中保存的实际位置找不到 let ,那么将会为该值分配 Undefined

        

    上述过程大家可以参照下图,可能不太准确但还是可以帮助大家理解

    执行环境的内容大概就是这些,明天更新作用域、作用域链相关内容

  • 相关阅读:
    python自动化测试学习笔记-8单元测试unittest模块
    python自动化测试学习笔记-8多线程
    python自动化测试学习笔记-7面向对象编程,类,继承,实例变量,邮件
    python自动化测试学习笔记-6excel操作xlwt、xlrd、xlutils模块
    android 拍照上传文件 原生定位
    golang 固定worker 工作池
    小程序报错x509: certificate signed by unknown authority
    PostgreSQL 添加postgis插件实现获取经纬度间的距离
    微信小程序使用mqtt mpvue mosquito
    golang 调用顺丰API接口测试
  • 原文地址:https://www.cnblogs.com/lhyxq/p/10108886.html
Copyright © 2011-2022 走看看