JavaScript

JavaScript 知识量:26 - 101 - 483

3.2 执行上下文与作用域><

执行上下文- 3.2.1 -

JavaScript的执行上下文(Execution Context)是JavaScript代码在执行时的环境。每个JavaScript代码块在执行时都会创建一个新的执行上下文。

执行上下文主要有三种类型:

  1. 全局执行上下文:这是默认或者基础的执行上下文。所有的JavaScript代码都在全局上下文中执行。它包含两个重要的对象:全局对象和this关键字。

  2. 函数执行上下文:每当一个函数被调用时,都会为该函数创建一个新的执行上下文。每个函数都有自己的执行上下文,但在创建时,会从全局上下文中继承一些变量和函数。

  3. Eval函数上下文:在eval函数内部执行的代码也会创建一个新的执行上下文,但这种上下文与函数执行上下文略有不同。

每个执行上下文都有以下结构:

  • 变量对象(Variable Object):包含了函数的参数、内部变量和函数声明。

  • 作用域链(Scope Chain):用于解析变量名的链式结构。当变量需要被检索时,JavaScript引擎会在作用域链上进行查找。

  • this值:在非严格模式下,全局执行上下文中的this值是全局对象(在浏览器中是window对象)。在函数执行上下文中,this值取决于函数是如何被调用的。

  • 闭包:闭包是函数可以记住并访问其词法作用域,即使该函数在其词法作用域之外执行。闭包是由两部分组成的:一个是闭包定义(code),一个是闭包的环境(environment)。闭包的环境就是变量对象和作用域链的组合。

JavaScript引擎会为每个执行上下文分配内存空间,包括变量对象、作用域链、this值和闭包等。当代码块开始执行时,就会创建一个新的执行上下文,当代码块执行完毕后,对应的执行上下文就会被销毁。

变量声明- 3.2.2 -

在JavaScript中,可以使用var,let,和const关键字来声明变量。以下是具体的声明方式:

1. var关键字:这是最早的JavaScript变量声明方法。例如,可以这样声明一个变量:

var x = 10;

在函数内部或全局作用域内,也可以这样声明变量:

function test() {  
  var x = 10;  
}  
  
var y = 20;

使用var声明的变量在声明后会立即被创建,并被赋值undefined。
2. let关键字:let是ES6引入的新特性,用于声明块级作用域变量。例如:

let y = 20;

在块级别作用域(比如一个if语句,一个for循环,或者一个函数)内部可以声明块级作用域变量:

if (true) {  
  let x = 10;  
}

使用let声明的变量在声明后会被立即创建并赋值undefined。与var不同,let声明的变量在声明时不能进行初始化。
3. const关键字:const也是ES6引入的新特性,用于声明块级作用域常量。例如:

const PI = 3.14159;

在块级别作用域(比如一个if语句,一个for循环,或者一个函数)内部可以声明块级作用域常量:

if (true) {  
  const x = 10;  
}

使用const声明的变量在声明后会立即被创建并赋值undefined。与var和let不同,const声明的变量是一个只读的常量。一旦赋值后,就不能改变其值。如果试图改变其值,JavaScript会抛出一个错误。