1

我只是想弄清楚执行上下文工作流程的简单解释。

- 代码

var a=10;

function sample(){

   var y = 10;

};

--

  • Javascript 引擎启动。
  • 创建全局执行上下文。
  • 创建词汇和变量环境对象。
  • 此属性已创建。指向全局对象。
  • 环境对象(词法和变量)具有环境记录和
    外部属性。任何人都可以通过解释
    在这种情况下环境对象的差异来提供帮助。

  • 创建阶段扫描代码变量被提升为全局上下文。

  • 环境对象内的环境记录(词法或变量??)保留变量定义。
  • 它扫描函数代码并找到示例函数。当它找到一个函数时会发生什么?现在是否设置了 [[scope]] 属性?如果有人可以清楚地解释 [[scope]] 属性,那就太好了

  • 全局执行上下文的执行阶段开始。

  • 到达函数示例。
  • 创建示例函数上下文。
  • 与上述类似的步骤发生在创建阶段。
  • 创建一个执行上下文(
  • 创建了词法和变量环境)
  • 词法环境有一个环境记录和
    指向全局词法环境的外部环境。
  • 变量环境也是用类似的属性创建的。
  • 变量被提升。
  • 现在 [[scope]] 属性发生任何变化?
  • 执行进入执行阶段。等等。

请注意:我有点理解当可能存在函数表达式或 try catch 子句等时解释和行为会发生变化。已阅读变量环境在这种情况下发挥作用。我只是在寻找上述功能的工作流程。甚至函数的参数也会创建一个参数属性。这也可以忽略。只是基于上面的示例代码对词法变量环境和 [[scope]] 属性的一个非常简单的解释。还有一个这个属性。在这种情况下,它只是全局对象 - 我相信两种上下文的窗口。让我们也忽略它以保持简单:)。在理解这可能是我将为此创建一个单独的问题:)。

希望有人可以帮助我理解这个基本概念。寻找基于 ES5 的解释。提前谢谢你的帮助。

米娅

4

1 回答 1

0

当您在代码中使用 var 时,Javascript 会进行变量提升。

var a=10;

function sample(){

   var y = 10;

};

因此编译器会将您上面的代码转换为以下代码。变量将被提升到其范围的顶部。

var a=undefined;
a=10;

function sample(){
  var y=undefined; // this is because var is function scoped in javascript
  y=10;
};

还说你有以下代码。

var a=10;

if(true){
  var b=20;
}

上面的代码将由编译器翻译成-

var a=undefined;
var b=undefined;

    a=10;
    if(true){
       b=20;
    }
于 2016-08-26T09:13:33.607 回答