JavaScript ES新特性块级作用域

作者:异步漫步

时间:2026-10-24

浏览:482

本文深入解析JavaScript ES6引入的块级作用域概念,重点介绍let关键字如何解决ES5中变量覆盖、循环变量泄露及内存占用等问题,并探讨块级作用域内函数声明的规范与行为差异。

文章目录

前言:

在深入探讨块级作用域之前,我们需要先明确作用域的基本定义:作用域决定了代码中特定成员(如变量或函数)的有效范围。

1.块级作用域是什么

所谓的块级作用域,就是该变量只能在声明时的代码块或者子代码块中使用。在ECMAScript 2015以前的版本中是不存在块级作用域的,而ECMAScript 2015提供的let关键字,使JavaScript出现了块级作用域,示例代码如下所示


/*
 * 块级作用域只能使用 let 关键字
 * let关键字不仅可以声明块级作用域, 还可以用在全局作用域和函数作用域
 */
// 全局作用域
let a = 100; // 全局变量
(function () {
  // 函数作用域
  let b = 200; // 局部变量
})()
if (true) {
  // 块级作用域
  let c = 300; // 局部变量
}
console.log(a); // 100
console.log(b); // 抛出异常
console.log(c); // 抛出异常


2.为什么需要块级作用域

在ECMAScript 5标准中,JavaScript仅存在全局作用域和函数作用域,缺乏块级作用域。这种设计导致了一些潜在的问题:

局部作用域内的变量可能会意外覆盖全局变量。


var v = 100;
(function(){
  console.log(v); // undefined 
  var v = 200;
})


在循环结构中用于计数的变量,如果未使用块级作用域,可能会泄露成为全局变量。


// 定义一个循环体
for (var v = 0; v < 10; v++) {
  console.log("这是一个 for 循环"); // 这是一个 for 循环 * 10
}
console.log(v); // 10

如果在循环结束后不手动释放相关变量,该变量的生命周期将跟随整个脚本的运行,从而持续占用内存资源。

3.与函数声明

根据ECMAScript5标准的规定,函数的声明只能出现在全局作用域或函数作用域中,不允许在块级作用域内进行声明。

情况一:


if (true) {
  function f() {}
}


情况二:


try {
  function f() {}
} catch(e) {
  // ...
}

上述两种在块级作用域中声明函数的情况,依据ECMAScript5标准均被视为非法操作。

然而,ECMAScript 2015标准规定,在块级作用域中声明函数时,其行为类似于使用了var关键字,即该函数在当前块级作用域之外无法被访问。


{
  function fun() {
    console.log('this is fun');
  }
}
fun(); // this is fun
// 上面的等同于下面的函数
{
  var fn = function () {
    console.log('this is fn');
  }
}
fn(); // this is fn
// 如果使用 let 关键字 则在块级作用域外无法访问
{
  let f = function () {
    console.log('this is f');
  }
}
f(); // 抛出异常 描述信息为 ReferenceError: f is not defined

至此,关于JavaScript ES新特性中块级作用域的详细介绍已完毕。如需了解更多相关ES新特性内容,请搜索本站过往文章或继续浏览后续相关文章,感谢大家的支持!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章