js的执行上下文

js中代码有三种类型 : global , function , eval

每一种代码的执行都需要依赖自身的上下文环境

每种代码的执行(程序开始执行,函数被调用,eval代码执行)都会产生一个新的上下文环境,这个上下文环境就称为执行上下(execution context--EC)

执行上下文可以抽象的认为是一个Object,具有一系列属性,其大体结构如下:

Execution Context : {

    variable object : [vars,function declaration,arguments,...]

    scope chain : [variable object,all parent scopes]

    this : context object
}

变量对象(variable object)

变量对象的抽象表示:

VO : {
    var1 : xxx,
    var2 : xxx,
    var3 : <function>
}

变量对象用于存储定义在上下文中的变量(vars) 和 函数声明(function declaration) ---函数表达式不包含在内
函数与global和eval稍有不同,在函数上下文中,变量对象被表示为活动对象(activation object)

活动对象(activation object)

活动对象是函数上下文中的变量对象,函数被激活时被创建,活动对象拥有变量对象的属性,除此之外,活动对象还包含了特殊对象arguments,抽象表示为:

AO : {
    var1 : xxx,
    var2 : xxx,
    var3 : <function>,
    arguments : {0:xxx,1:xxx}
}

作用域链(scope chain)

作用域链是一个对象列表,用来检索上下文中出现的标识符(identifiers) ---标识符可以认为是变量,函数声明或者函数中的参数
通常情况下,作用域链包括自身变量对象或活动对象,父级变量对象(try和with语句会产生临时作用域对象,导致作用域变更)

This指针

this是执行上下文的一个属性,不是某个变量对象的属性.
this的值直接从执行上下文中获取,而不会从作用域链中搜寻。也就是说this的值只取决于进入上下文时的情况。所以,this是不允许赋值的

时间: 2024-08-27 02:37:10

js的执行上下文的相关文章

JS高级 -- 执行上下文与作用域链

这个问题涉及到三个点: 1. 执行上下文 2. 函数嵌套导致的执行上下文栈 3.闭包 1 <script> 2 var a = 1; 3 var f1 = function(){//第一个函数 4 var a = 2; 5 var b = 1; 6 7 var f2 = function(){//第二个函数 8 var c = 1; 9 var f3 = function(){//第三个函数 //第三个函数执行,他自己的执行上下文中没有a,b,c,则从父级函数f2的执行上下文中去找,f2中有c

进阶学习js中的执行上下文

在js中的执行上下文,菜鸟入门基础 这篇文章中我们简单的讲解了js中的上下文,今天我们就更进一步的讲解js中的执行上下文. 1.当遇到变量名和函数名相同的问题. var a = 10; function a(){ console.log(1); } a(); //报错 如果你觉得函数a会覆盖变量a那你肯定是js的新朋友,为什么这里会报错呢?我记得我在基础的执行上下文文章中说过变量声明提前的概念,对这里就是因为这个原因,但是在上面一篇文章中还有一个问题我没有去讲. 那就是函数的声明比变量的声明顺序

js执行上下文(由浅入深)

每一个函数都有自己的执行上下文EC(执行环境 execution context),并且每个执行上下文中都有它自己的变量对象VO(Variable object),用于存储执行上下文中的变量 .函数声明 .函数参数,这解释了js如何找到我们定义的函数和变量.并且函数是js中唯一一个能创建出作用域的,注意:for,if()else()不能创建作用域.我们通过以下几个例子说明为什么函数和变量的声明会被前置,为什么匿名函数表达式的不可以在外面调用. var a = 18; f1(); function

Js 作用域与作用域链与执行上下文不得不说的故事 ?(? ???ω??? ?)?

最近在研究Js,发现自己对作用域,作用域链,活动对象这几个概念,理解得不是很清楚,所以拜读了@田小计划大神的博客与其他文章,受益匪浅,写这篇随笔算是自己的读书笔记吧~. 作用域 首先明确一个概念,js只有函数作用域(function-based),没有块级作用域,也就是只有函数会有自己的作用域,其他都没有. 接着,作用域分为全局作用域与局部作用域. 全局作用域中的对象可以在代码的任何地方访问,一般来说,下面情况的对象会在全局作用域中: 最外层函数和在最外层函数外面定义的变量 没有通过关键字"va

js执行上下文

1.什么是执行上下文 JavaScript是一个单线程语言,意味着同一时间只能执行一个任务.当JavaScript解释器初始化执行代码时, 它首先默认进入全局执行环境(execution context),从此刻开始,函数的每次调用都会创建一个新的执行环境. 2.执行环境的分类 全局环境--JavaScript代码运行时首次进入的环境. 函数环境--当函数被调用时,会进入当前函数中执行代码. Eval--eval内部的文本被执行时(因为eval不被鼓励使用,此处不做详细介绍). 3.执行上下文栈

js基础梳理-究竟什么是执行上下文栈(执行栈),执行上下文(可执行代码)?

日常在群里讨论一些概念性的问题,比如变量提升,作用域和闭包相关问题的时候,经常会听一些大佬们给别人解释的时候说执行上下文,调用上下文巴拉巴拉,总有点似懂非懂,不明觉厉的感觉.今天,就对这两个概念梳理一下,加深对js基础核心的理解. 1. 执行上下文(execution context)与可执行代码(execution code) 1.1 首先说一下,可执行代码的类型有哪些: 全局代码:例如加载外部的js文件或者本地标签内的代码.全局代码不包括 function 体内的代码 函数代码:functi

一篇文章看懂JS执行上下文

 壹 ? 引 我们都知道,JS代码的执行顺序总是与代码先后顺序有所差异,当先抛开异步问题你会发现就算是同步代码,它的执行也与你的预期不一致,比如: function f1() { console.log('听风是风'); }; f1(); //echo function f1() { console.log('echo'); }; f1(); //echo 按照代码书写顺序,应该先输出 听风是风,再输出 echo才对,很遗憾,两次输出均为 echo:如果我们将上述代码中的函数声明改为函数表达式,

1--面试总结-js深入理解,对象,原型链,构造函数,执行上下文堆栈,执行上下文,变量对象,活动对象,作用域链,闭包,This

参考一手资料:http://dmitrysoshnikov.com/ecmascript/javascript-the-core/中文翻译版本:https://zhuanlan.zhihu.com/p/32042645 Javascript 是一种单线程编程语言,这意味着它只有一个调用栈,call Stack(调用栈 ,,先入后出) 核心:对象,原型链,构造函数,执行上下文堆栈,执行上下文,变量对象,活动对象,作用域链,闭包,This js原型链? 定义 原型对象也是简单的对象并且可以拥有它们自

原型模式故事链(4)--JS执行上下文、变量提升、函数声明

上一章:JS的数据类型 传送门:https://segmentfault.com/a/11... 好!话不多少,我们就开始吧.对变量提升和函数声明的理解,能让你更清楚容易的理解,为什么你的程序报错了~哈哈哈 我们前端的代码一般就三个部分组成html + css +js,一般呢我们的JS又会放在最后执行. 执行上下文:所谓的执行上下文,就是JS代码执行的环境. Javascript中代码的运行环境分为以下三种: 全局上下文 - 这个是默认的代码运行环境,一旦代码被载入,引擎最先进入的就是这个环境.