返回

执行上下文和作用域到底是什么?二者有什么关系

前端

好的,下面是关于执行上下文和作用域的文章:

执行上下文和作用域——密切相关却又不同的概念

JavaScript在执行代码之前,需要经过一系列的“准备”,这被称为执行上下文,其包含词法环境(Lexical Environment)和上下文(this)。

那么,执行上下文和作用域分别是什么呢?二者有什么关系呢?

执行上下文

执行上下文是一个抽象的概念,它了JavaScript代码在执行时所处的环境。执行上下文包含了词法环境和上下文(this)。

词法环境

词法环境是指JavaScript代码在执行时所处的位置,它决定了变量和函数的作用域。词法环境是在代码编写时确定的,在代码执行时不会发生变化。

例如,在下面的代码中,词法环境是函数foo()的内部,因此变量a和b只在函数foo()内部可见:

function foo() {
  var a = 1;
  var b = 2;
}

上下文

上下文(this)是指执行代码的对象。上下文在代码执行时确定,在代码执行过程中可能会发生变化。

例如,在下面的代码中,上下文是全局对象window:

console.log(this); // window

而在下面的代码中,上下文是对象obj:

var obj = {
  name: "John Doe",
  logName: function() {
    console.log(this.name);
  }
};

obj.logName(); // John Doe

作用域

作用域是指变量和函数的可访问范围。作用域是在代码编写时确定的,在代码执行时不会发生变化。

作用域有两种:全局作用域和局部作用域。

全局作用域

全局作用域是指整个JavaScript代码可访问的作用域。全局作用域中的变量和函数可以在任何地方访问。

例如,在下面的代码中,变量a是全局变量,可以在任何地方访问:

var a = 1;

console.log(a); // 1

局部作用域

局部作用域是指函数内部的作用域。局部作用域中的变量和函数只能在函数内部访问。

例如,在下面的代码中,变量b是局部变量,只能在函数foo()内部访问:

function foo() {
  var b = 2;

  console.log(b); // 2
}

console.log(b); // ReferenceError: b is not defined

执行上下文与作用域的关系

执行上下文和作用域是密切相关却又不同的概念。

执行上下文是JavaScript代码在执行时所处的环境,而作用域是变量和函数的可访问范围。

执行上下文决定了词法环境和上下文,词法环境决定了作用域。

例如,在下面的代码中,执行上下文是函数foo()的内部,词法环境也是函数foo()的内部,因此作用域是函数foo()的内部:

function foo() {
  var a = 1;

  console.log(a); // 1
}

console.log(a); // ReferenceError: a is not defined

总结

执行上下文和作用域是JavaScript的重要概念,理解这两个概念有助于我们更好地理解JavaScript代码的执行过程。