3 回答

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行才会定义。

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
添加回答
举报