返回

深入理解 ES6 读后总结——块级作用域绑定

前端

在 JavaScript 中,作用域的概念对于理解代码的运行机制至关重要。作用域决定了变量的可见性,即变量可以在哪些代码块中被访问。在 ES6 之前,JavaScript 只有全局作用域和函数作用域两种作用域类型。全局作用域中的变量可以在任何地方被访问,而函数作用域中的变量只能在函数内部被访问。

ES6 引入了块级作用域的概念,使得我们可以使用 let 和 const 来声明变量,从而在代码块中创建块级作用域。块级作用域中的变量只能在该代码块内部被访问,一旦离开该代码块,变量就会被销毁。

块级作用域的引入极大地增强了 JavaScript 的代码组织性和可读性,也使得代码更加安全和可靠。

变量提升

在 JavaScript 中,变量提升是一个非常重要的概念。变量提升是指在代码执行之前,所有变量都会被提升到当前作用域的顶部。这意味着,无论变量是在代码块的开头还是结尾声明的,它都会被提升到代码块的顶部。

变量提升的机制使得我们可以使用变量提升来避免变量重复声明的错误。例如,以下代码是合法的:

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

在上面的代码中,变量 a 在函数 foo 的顶部被提升,因此即使我们在函数内部将 a 重新赋值为 2,也不会出现变量重复声明的错误。

作用域

作用域是 JavaScript 中的一个重要概念。作用域决定了变量的可见性,即变量可以在哪些代码块中被访问。在 JavaScript 中,作用域分为全局作用域和局部作用域。

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

let 和 const

在 ES6 中,我们使用 let 和 const 关键字来声明变量。let 关键字声明的变量是块级作用域的,而 const 关键字声明的变量是常量,即不能被重新赋值。

let 关键字声明的变量只能在声明它的代码块内部被访问,一旦离开该代码块,变量就会被销毁。例如,以下代码是合法的:

{
  let a = 1;
  console.log(a); // 1
}

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

在上面的代码中,变量 a 在代码块内部被声明,因此只能在该代码块内部被访问。一旦离开该代码块,变量 a 就会被销毁,因此在代码块外部访问变量 a 会抛出 ReferenceError 错误。

const 关键字声明的变量是常量,即不能被重新赋值。例如,以下代码是合法的:

const a = 1;
a = 2; // TypeError: Assignment to constant variable.

在上面的代码中,变量 a 是一个常量,因此不能被重新赋值。尝试重新赋值变量 a 会抛出 TypeError 错误。

闭包

闭包是指函数访问其父函数作用域中变量的一种能力。在 JavaScript 中,闭包是一个非常重要的概念,它可以帮助我们创建更强大和灵活的代码。

闭包的创建方式非常简单,只需要将一个函数嵌套在另一个函数内部即可。例如,以下代码是一个闭包的例子:

function foo() {
  var a = 1;

  function bar() {
    console.log(a); // 1
  }

  return bar;
}

var baz = foo();
baz(); // 1

在上面的代码中,函数 bar() 是函数 foo() 的闭包,它可以访问函数 foo() 作用域中的变量 a。即使函数 foo() 已经执行完毕,函数 bar() 仍然可以访问变量 a,这是因为函数 bar() 已经将变量 a 捕获到了自己的作用域中。

闭包可以帮助我们创建更强大和灵活的代码。例如,我们可以使用闭包来创建私有变量和方法,或者我们可以使用闭包来实现延迟执行的功能。