博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(O)JS:执行环境、变量对象、活动对象和作用域链(原创)
阅读量:5080 次
发布时间:2019-06-12

本文共 1365 字,大约阅读时间需要 4 分钟。

var a=1;function b(x){    var c=2;    console.log(x);}b(3);

·执行环境(execution context),也称为环境、执行上下文、上下文环境、执行上下文环境:

  每次当控制器转到ECMAScript可执行代码的时候,即会进入到一个执行上下文。执行上下文(简称-EC)是
ECMA-262标准里的一个抽象概念,用于同可执行代码(executable code,分为全局代码、函数代码和eval代码)
概念进行区分。
  通俗的话来讲就是,JS中的函数运行不能仅仅看函数内部有哪些变量,再简单的做运算就行了,而是执
行前需要根据函数所处的环境(代码执行前的准备工作),如:变量、函数声明和arguments,来取值(在执
行代码之前,把将要用到的所有的变量都事先拿出来,有的直接赋值了,有的先用undefined占个坑)运算。
  执行环境主要包含变量对象、作用域链和this三部分内容。

·变量对象(variable object):

  变量对象属于执行环境的一部分,每个执行环境都有一个对象用来存储执行环境中的变量、函数声明和
arguments,这个对象就是执行环境的变量对象。
  全局环境的变量对象始终存在,局部环境变量对象只有在函数执行的过程中存在,每个函数都有自己的
执行环境。
  全局环境对象内容包括:var a=undefined、function b(){...}、this=windows。而像b()这样的的局
部变量对象内容包括了:var c=undefined、arguments=[3]、x=3、this=windows。
·活动对象(activation object):
  在函数执行上下文中,VO是不能直接访问的,此时由活动对象(activation object,缩写为AO)扮演VO的
角色。

·作用域链:

  function b(){}创建时,会创建一个预先包含全局变量的作用域链,这个作用域链被保存在[[Scope]]属
性中。当b()调用时会创建一个执行环境,然后通过复制函数的[[Scope]]属性中对象构建起执行环境的作用
域链。随后,又有一个活动对象(在此作为变量对象使用)被创建并推入执行环境作用域前端。对于这个例
子中的执行环境而言,其作用域链包括了2个变量对象:全局变量对象和其内部活动对象。
  显然,作用域链是本质上是一个指向变量对象的指针列表,它只是引用但不实际包含变量对象。

·this:详情移动。

·执行上下文栈(execution context stack,ECS):

    当我们运行多个函数时,如何管理那么多执行环境呢?
    所以JS引擎创建了执行上下文栈来进行管理。当JS开始解释执行代码时,最先遇到的是全局代码,所以初始
化时首先会向执行上下文栈中压入一个全局执行环境,并且只有当整个应用程序结束后,ECS才会被清空,全局
执行环境在最底部是最后一个被清除的。

·变量的搜索机制:

  先搜索局部变量,如果没找到,往上一层查找,直到搜索全部变量,如果都没找到,返回undefined。

转载于:https://www.cnblogs.com/jacksplwxy/p/6725850.html

你可能感兴趣的文章
webpack——react
查看>>
text文本框 按回车键不触发submit事件的问题(IE)
查看>>
jvm(3)---常用监控工具指令
查看>>
yii框架中findall方法取数据使用 条件获取的写法
查看>>
【LeetCode算法-20】Valid Parentheses
查看>>
测试工程方法:等价类划分法
查看>>
Xcode模拟iPhone教程!
查看>>
JS实现背景图按时切换或者每次更新
查看>>
字符编码笔记:ASCII,Unicode和UTF-8
查看>>
C Linux read write function extension
查看>>
指针、数组和指针算术
查看>>
[Node.js] ECMAScript 6中的生成器及koa小析
查看>>
自定义图表技术解析
查看>>
c语言打开一个程序
查看>>
图像显示特效
查看>>
apollo配置中心初探
查看>>
elasticsearch配置
查看>>
jquery attr与prop的区别与联系
查看>>
swift基本运算符
查看>>
VMware Ubuntu安装
查看>>