返回

重学JavaScript之执行上下文栈

前端

前言深入分析javascript之执行上下文栈不忘初心,牢记使命

很多同学看到这里的时候可能会认为:“js基础太简单啦,有必要写吗?”。的确,相对于初学js的我们,现在回顾是很简单,但是自然界有一个规律:温故而知新。而js作为前端开发的基础,是需要我们不断巩固、温习,防止自己忘记的。从另一方面来说,当我们学完其他知识后,再来回顾js基础,你会发现很多曾经学过的知识,会让你有一种茅塞顿开的感觉。并且在面试的时候,这也是基础考察点之一,所以我们很有必要再来温习一下js的基础。

什么是执行上下文栈

执行上下文栈(Execution Context Stack)是JavaScript引擎用来管理代码执行上下文的一种数据结构。它是一个后进先出(LIFO)的栈,其中每个元素都是一个执行上下文对象。当JavaScript引擎执行代码时,它会为每个函数创建一个新的执行上下文对象并将其推入执行上下文栈。当函数执行完毕后,它的执行上下文对象会被弹出栈。

执行上下文栈的作用

执行上下文栈的作用是为代码提供一个执行的环境。每个执行上下文对象都包含了以下信息:

  • 变量对象:存储着该执行上下文中的变量。
  • 作用域链:存储着该执行上下文中的作用域。
  • this对象:指向该执行上下文中的当前对象。

作用域

作用域是代码能够访问变量和函数的区域。在JavaScript中,有三种作用域:

  • 全局作用域:全局作用域是JavaScript程序的顶级作用域。它包含了所有全局变量和函数。
  • 函数作用域:函数作用域是函数内部的作用域。它包含了函数内部声明的变量和函数。
  • 块级作用域:块级作用域是代码块内部的作用域。它包含了代码块内部声明的变量。

词法作用域

词法作用域是指函数的作用域是由其在源代码中的位置决定的。这意味着一个函数的作用域不受它被调用的位置的影响。例如:

function outer() {
  var x = 1;

  function inner() {
    console.log(x);
  }

  inner();
}

outer();

在这个例子中,inner函数的作用域是outer函数的作用域,即使它是在全局作用域中被调用的。这是因为inner函数是在outer函数的源代码中声明的。

变量提升

变量提升是指在JavaScript中,变量和函数的声明会被提升到它们所在的作用域的顶部。这意味着变量和函数可以在它们被声明之前被使用。例如:

console.log(x);

var x = 1;

在这个例子中,变量x在它被声明之前就被使用了。这是因为变量x的声明被提升到了全局作用域的顶部。

函数执行上下文

函数执行上下文是JavaScript引擎为函数执行而创建的执行上下文对象。它包含了以下信息:

  • 变量对象:存储着函数内部声明的变量。
  • 作用域链:存储着函数内部的作用域。
  • this对象:指向函数内部的当前对象。

全局执行上下文

全局执行上下文是JavaScript引擎为全局代码执行而创建的执行上下文对象。它包含了以下信息:

  • 变量对象:存储着全局变量。
  • 作用域链:存储着全局作用域。
  • this对象:指向全局对象。

代码块执行上下文

代码块执行上下文是JavaScript引擎为代码块执行而创建的执行上下文对象。它包含了以下信息:

  • 变量对象:存储着代码块内部声明的变量。
  • 作用域链:存储着代码块内部的作用域。
  • this对象:指向代码块内部的当前对象。

严格模式

严格模式是JavaScript的一种语法模式,它可以使JavaScript代码更加安全和可靠。在严格模式下,一些在非严格模式下允许的操作在严格模式下是不允许的。例如,在严格模式下,变量必须在使用之前被声明,并且不能使用eval()函数。

总结

执行上下文栈是JavaScript引擎用来管理代码执行上下文的一种数据结构。它是一个后进先出(LIFO)的栈,其中每个元素都是一个执行上下文对象。当JavaScript引擎执行代码时,它会为每个函数创建一个新的执行上下文对象并将其推入执行上下文栈。当函数执行完毕后,它的执行上下文对象会被弹出栈。

执行上下文栈的作用是为代码提供一个执行的环境。每个执行上下文对象都包含了以下信息:

  • 变量对象:存储着该执行上下文中的变量。
  • 作用域链:存储着该执行上下文中的作用域。
  • this对象:指向该执行上下文中的当前对象。

作用域是代码能够访问变量和函数的区域。在JavaScript中,有三种作用域:全局作用域、函数作用域和块级作用域。

词法作用域是指函数的作用域是由其在源代码中的位置决定的。这意味着一个函数的作用域不受它被调用的位置的影响。

变量提升是指在JavaScript中,变量和函数的声明会被提升到它们所在的作用域的顶部。这意味着变量和函数可以在它们被声明之前被使用。

函数执行上下文是JavaScript引擎为函数执行而创建的执行上下文对象。它包含了以下信息:

  • 变量对象:存储着函数内部声明的变量。
  • 作用域链:存储着函数内部的作用域。
  • this对象:指向函数内部的当前对象。

全局执行上下文是JavaScript引擎为全局代码执行而创建的执行上下文对象。它包含了以下信息:

  • 变量对象:存储着全局变量。
  • 作用域链:存储着全局作用域。
  • this对象:指向全局对象。

代码块执行上下文是JavaScript引擎为代码块执行而创建的执行上下文对象。它包含了以下信息:

  • 变量对象:存储着代码块内部声明的变量。
  • 作用域链:存储着代码块内部的作用域。
  • this对象:指向代码块内部的当前对象。

严格模式是JavaScript的一种语法模式,它可以使JavaScript代码更加安全和可靠。在严格模式下,一些在非严格模式下允许的操作在严格模式下是不允许的。例如,在严格模式下,变量必须在使用之前被声明,并且不能使用eval()函数。