美文网首页
js:执行上下文

js:执行上下文

作者: 啊哈_57ea | 来源:发表于2018-05-04 17:02 被阅读0次

抽象概念:执行上下文,变量对象,激活对象。

执行上下文既执行环境(execution context,EC),当js代码运行时会进入不同的执行上下文:

(1)每次函数调用时,都会有一个对应的执行环境,称为执行上下文(Execution Context,缩写为EC);

(2)对整个全局作用域,在运行第一行代码前,会有一个全局执行上下文;

(3)同样一个函数,在被调用多次时,每次都有不同的执行上下文。

js执行上下文共三种:

1、全局执行环境

是JS代码开始运行时的默认环境(浏览器中为window对象)。全局执行环境的变量对象始终都是作用域链中的最后一个对象。

2、函数执行环境

当某个函数被调用时,会先创建一个执行环境及相应的作用域链。然后使用arguments和其他命名参数的值来初始化执行环境的变量对象。

3、使用eval()执行代码

javascript是一个单线程语言,这意味着在浏览器中同时只能做一件事情。当javascript解释器初始执行代码,它首先默认进入全局上下文。每次调用一个函数将会创建一个新的执行上下文。 

每次新创建的一个执行上下文会被添加到作用域链的顶部,有时也称为执行或调用栈。浏览器总是运行位于作用域链顶部的当前执行上下文。一旦完成,当前执行上下文将从栈顶被移除并且将控制权归还给之前的执行上下文。

不同执行上下文之间的变量命名冲突通过攀爬作用域链解决,从局部直到全局。这意味着具有相同名称的局部变量在作用域链中有更高的优先级。 

简单的说,每次你试图访问函数执行上下文中的变量时,查找进程总是从自己的变量对象开始。如果在自己的变量对象中没发现要查找的变量,继续搜索作用域链。它将攀爬作用域链检查每一个执行上下文的变量对象,寻找和变量名称匹配的值

上下文栈

基本概念:

1、变量对象(vo):是一个抽象概念中的对象,用于存储执上下文中的:变量、函数声明、函数参数。

执行上下文的建立过程:

当一个函数被调用的时候,会进入一个执行上下文,具体的执行上下文建立如下:

一、建立阶段,(发生在函数被调用,但是在执行函数体内的具体代码以前):

这个阶段会初始化变量对象:

具体有如下操作:1、建立arguments对象,检查当前上下文中的参数,建立该对象下的属性以及属性值

(若未传入,则初始化该参数为undefined)

2、初始化当前上下文中的函数声明:

    a、每找到一个函数声明,就在ov下面用函数名建立一个属性,属性值就是指向该函数在内存中的地址的一个引用。

    b、如果上述函数名已经存在于ov下,那么对应的属性值会被新的引用所覆盖(即发生冲突会覆盖)\

3、初始化变量声明:

    a、每找到一个变量的声明,就在variableObject下,用变量名建立一个属性,属性值为undefined。

    b、如果该变量名已经存在于vo属性中,直接跳过(即发生重复会忽略)

4、初始化作用域链

5、确定this指向

(注:函数表达式不会影响vo)

命名冲突测试如下:

备注:在vo初始化过程阶段,检查函数声明s时发现,ov中已经存在s所以会覆盖,故s的类型是function 备注:在vo初始化过程阶段,检查变量声明s时发现,ov中已经存在s所以会直接跳过,故s的类型是function

二、代码执行阶段

执行函数体中的代码,一行一行地运行代码,给vo中的变量属性赋值。

备注:在上下文建立阶段中 s的的值是这个函数 但是在代码执行阶段vo中的属性s被赋值成2。

函数表达式不会存在于ov中 例如:

function test(a,b){
    var c = 10;

    function d(){

    };

    var e = function _e(){

    }

    (function x(){})

    b = 20;
}

test(10);

在执行上下文的第一阶段 结果 :

备注:函数表达式_e,x没有出现在vo中,(a=10,arguments 对象直接传值为10,b:arguments 对象 没有传值所以为undefined)。

执行上下文第二阶段 结果:

相关文章

  • 闭包和this

    执行上下文 执行上下文是什么 可以简单理解执行上下文是js代码执行的环境,当js执行一段可执行代码时,会创建对应的...

  • js 随笔

    js 执行机制: js执行上下文: 只有理解了js 执行上下文才能更好的理解 js变量提升以及 作用域和闭包 所谓...

  • JS中的执行上下文

    执行上下文 1. 定义 执行上下文就是js代码被解析和执行时所在环境的抽象概念,js的所有代码都是在执行上下文中运...

  • 函数的底层处理机制

    js上下文分类 js上下文(哪一个区域下执行)分类: 1.全局上下文EC(G) 2.函数执行形成...

  • 执行上下文(个人笔记)

    本文参考:javaScript执行上下文和执行上下文栈一篇文章看懂JS执行上下文什么是执行上下文?什么是调用栈? ...

  • 我的JS笔记 -- 执行上下文

    执行上下文,就是Js执行的时候的一个运行环境/作用域(scope)。执行上下文决定了Js执行过程中可以获取哪些变量...

  • javascript-执行上下文(执行上下文环境)

    执行上下文: 当出现js代码时,就出现了执行上下文,或叫做执行上下文环境。一般来说,执行上下文完成以下工作: 1....

  • JS对象模型 - 执行模型

    对象 js的对象模型,执行上下文

  • JS-变量提升/函数提升

    首先了解执行上下文(EC)【你不知道的JavaScript】(三)执行上下文及其生命周期JS中的执行上下文(Exe...

  • JS Context

    js的执行上下文 在js中,执行上下文保存着函数执行所需的重要信息,其中包括了三个属性: 变量对象作用域链this...

网友评论

      本文标题:js:执行上下文

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