返回

作用域,闭包与执行上下文:深入JS三大概念

前端

作用域的含义

作用域,指的是函数或者变量可访问的范围。在代码编译(编译器中)的过程中有三个重要的步骤:

  1. 词法分析:将一连串的字符打断成为有意义的片段,称之为token。
  2. 语法分析:将一个token序列解析为一个语法树(parse tree),根据不同的编程语言,解析的结果会有一定的差异。
  3. 代码生成:按照既定策略为所生成的parse tree选择合适的机器指令序列,然后进行代码输出。

其中,作用域是在词法分析阶段确定的,因此也称为词法作用域或静态作用域。

作用域的类型

在JavaScript中,作用域有两种类型:

  • 全局作用域:全局作用域是整个程序可以访问的作用域,在全局作用域中声明的变量和函数可以在程序的任何地方访问。
  • 局部作用域:局部作用域是函数内部的作用域,在局部作用域中声明的变量和函数只能在该函数内部访问。

闭包的含义

闭包是指那些能够访问自由变量的函数,而这些自由变量是在函数定义之外的。换句话说,闭包是一个函数,它可以访问其定义时所在的词法作用域中的变量,即使该函数已经执行完毕,其所在作用域已经被销毁。

闭包的创建

闭包的创建非常简单,只需在一个函数内部定义另一个函数即可。例如:

function outer() {
  var x = 10;

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

  return inner;
}

var inner = outer();

inner(); // 10

在这个例子中,函数inner是函数outer的闭包,它可以访问函数outer中的变量x。即使函数outer已经执行完毕,其所在作用域已经被销毁,但函数inner仍然可以访问变量x。

闭包的应用

闭包在JavaScript中有很多应用,例如:

  • 事件处理:在事件处理函数中使用闭包可以访问事件发生时的变量。
  • 模块化:闭包可以用来创建一个私有作用域,从而实现模块化。
  • 函数柯里化:闭包可以用来实现函数柯里化,即创建一个新的函数,该函数接受一个参数,并返回一个新的函数,该函数接受另一个参数,依此类推。

执行上下文

执行上下文是JavaScript执行代码时创建的上下文环境,它包含了当前正在执行的代码、当前代码所处的作用域、以及当前代码可以访问的变量和函数。

执行上下文的创建

执行上下文是在代码执行时创建的,它与代码执行的栈相关联。当一个函数被调用时,一个新的执行上下文就会被创建,该执行上下文包含了函数的参数、函数的局部变量、以及函数可以访问的外层作用域中的变量。当函数执行完毕时,其执行上下文就会被销毁。

执行上下文的类型

在JavaScript中,执行上下文有两种类型:

  • 全局执行上下文:全局执行上下文是程序启动时创建的执行上下文,它包含了全局作用域中的变量和函数。
  • 局部执行上下文:局部执行上下文是函数调用时创建的执行上下文,它包含了函数的参数、函数的局部变量、以及函数可以访问的外层作用域中的变量。

执行上下文的作用

执行上下文的作用是提供一个执行代码的环境,它包含了代码执行所需要的所有信息,例如:

  • 当前正在执行的代码
  • 当前代码所处的作用域
  • 当前代码可以访问的变量和函数

总结

作用域、闭包和执行上下文是JavaScript中三个密切相关的概念,它们共同决定了变量的可访问性和行为。理解这三个概念对于编写出健壮、可维护的JavaScript代码至关重要。