为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript中的“执行上下文”到底是什么?

JavaScript中的“执行上下文”到底是什么?

慕沐林林 2019-12-17 09:57:26
我的头衔几乎概括了这一切。谁能启发我...“ JavaScript中的“执行上下文”是什么?”以及它与“ this”,吊装,原型链,作用域和垃圾回收有何关系?
查看完整描述

3 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

您要问的是几个密切相关的不同概念。我将尝试简要地解决每个问题。


执行上下文是语言规范中的一个概念,用外行人的术语来说,大致等同于函数执行的“环境”。也就是说,变量作用域(以及作用域链,外部作用域的闭包中的变量),函数参数和this对象的值。


该调用堆栈是执行上下文的集合。


另请参阅此答案和本文。


范围从字面上说是:可以访问变量的范围。简单地说:


var x;


function a() {

    var y;

}

x可以从任何地方访问。何时a调用,x将在外部范围内。(存储在范围链中。)


相反,y只能由代码访问,a()因为它限于a的范围。这是什么var关键词呢:限制在局部范围的变量。如果我们省略var,y将最终出现在全局范围内,通常被认为是一件坏事。


将吊装更多地视为编译时的事情。在JavaScript中,函数声明 “悬挂”在其作用域的顶部。换句话说,它们是在分析任何其他代码之前进行解析和评估的。(这与内联求值的函数表达式相反。)请考虑以下几点:


a();

b();


function a() { }

var b = function() { }

对to的调用a()将成功,因为其声明已被置于最高位置;a在程序开始执行之前被自动分配给。到的调用b()将失败,TypeError因为b直到第4行才会定义。


查看完整回答
反对 回复 2019-12-17
?
jeck猫

TA贡献1909条经验 获得超7个赞

您已经问了很多概念,但让我们一个接一个地了解它们。


运行代码的环境是Execution context。 它是在执行代码时创建的。


Execution Context (Global),由JS Engine创建,其中包含3个重要的内容:


全局对象- window

特殊对象 this

参考外部环境

让我们看一个简单的例子来理解Global Execution Context:


var a = "Hello World";


function b(){


}

当JS Engine运行以上代码时,它将创建以下执行上下文(如图所示): 全局执行上下文


现在,让我们看看JS Engine是如何创建的Execution Context(然后我们将挖掘并了解提升):考虑以下情况:


b();

console.log(a);


var a = "Hello World!";

function b(){

    console.log("Called b!");

}

我可以调用该函数,b()即使它是在以后声明的。这意味着JS Engine在执行我的代码之前正在做一些事情,让我们看看:


JS Engine在执行任何代码时执行以下两个步骤:


创作阶段:


JS Engine解析-在您的代码中运行identifies variables & functions并由代码创建(将在执行阶段使用)

设置变量和函数的存储空间- “提升”

吊装 -在执行代码之前,JS引擎会设置代码内部使用的Var和Func的存储空间。这些变量和函数构成了要执行的任何函数的执行上下文。JS中的所有变量最初都设置为undefined。

执行阶段:非常简单易懂,


当代码逐行执行(由JS解释器执行)时,它可以访问在执行上下文中定义的变量

变量分配在此阶段完成

只要存在函数调用,就会创建一个新的执行上下文。


执行上下文堆栈: 调用函数时会发生什么:


function b(){


}


function a(){

    b();

}


a();

现在首先Global Execution Context要创建(如上所述)


然后执行开始,口译员遇到call to function

a(),并且here a new execution context is created pushed on top EC

Stack


因此,无论何时调用函数,都会创建一个新的EC并将其放置在EC Stack的顶部。


所以现在EC for a()是CREATEDinterpreeter将执行里面的代码a()行由行


然后口译员遇到call to function b(),这将创建另一个EC推到顶部或EC堆栈的对象


当b()完成将弹出的出栈,然后a()将完成与一路下跌至Global EC


查看完整回答
反对 回复 2019-12-17
  • 3 回答
  • 0 关注
  • 345 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号