📜  什么是 ES6 中的块作用域变量和函数?(1)

📅  最后修改于: 2023-12-03 15:36:07.916000             🧑  作者: Mango

ES6 中的块作用域变量和函数

在旧的 JavaScript 版本中,只有全局作用域和函数作用域,没有块级作用域。在 ES6 中,新增了块级作用域,也就是{}内包含的作用域。

块级作用域变量

ES6 中的块作用域变量是通过 let 和 const 关键字声明的。相比于 var,let 和 const 声明的变量只存在于当前块级作用域内,不会污染全局作用域。

function test () {
  var a = 1
  if (true) {
    let b = 2
    const c = 3
  }
  console.log(a) // 1
  console.log(b) // 报错:b is not defined
  console.log(c) // 报错:c is not defined
}

在上面的代码中,变量 a 是通过 var 关键字声明,属于函数作用域;而变量 b 和 c 则是通过 let 和 const 关键字声明,属于当前块级作用域。

块级作用域函数

在 ES6 之前,函数只存在于全局作用域和函数作用域中,不可能在块级作用域中声明。但是在 ES6 中,可以使用 function 关键字声明块级作用域函数。

function test () {
  var a = 1
  if (true) {
    function foo () {
      console.log('foo')
    }
  }
  console.log(a) // 1
  foo() // foo
}

在上面的代码中,我们定义了一个名为 foo 的函数,它属于 if 语句块的作用域范围,而不是全局作用域或函数作用域。

但是需要注意的是,在严格模式下是不能这样声明块级作用域函数的,会报错。

'use strict'
function test () {
  var a = 1
  if (true) {
    function foo () {
      console.log('foo')
    }
  }
  console.log(a) // 1
  foo() // 报错:foo is not defined
}
总结

ES6 中新增的块级作用域变量和函数,可以减少全局作用域的污染和变量名冲突问题。但需要注意,块级作用域函数在严格模式下不可用。同时,let 声明的变量可以被修改,而 const 声明的变量则不能被修改。