ES6中有哪些作用域

devtools/2025/1/19 23:05:29/

在ES6(ECMAScript 2015)中,作用域(Scope)是指变量、函数和对象在代码中的可访问范围。ES6 引入了新的作用域规则,除了传统的全局作用域和函数作用域外,还新增了块级作用域。以下是 ES6 中的主要作用域类型:

1. 全局作用域(Global Scope)

全局作用域是指在代码的最外层定义的变量或函数,它们在整个程序中都可以访问。

javascript">var globalVar = "I am global"; // 全局作用域function foo() {console.log(globalVar); // 可以访问全局变量
}foo(); // 输出: I am global
  • 在浏览器中,全局作用域的变量会挂载到 window 对象上。

  • 在 Node.js 中,全局作用域的变量会挂载到 global 对象上。

2. 函数作用域(Function Scope)

函数作用域是指在函数内部定义的变量或函数,它们只能在函数内部访问。

javascript">function bar() {let localVar = "I am local"; // 函数作用域console.log(localVar); // 可以访问局部变量
}bar(); // 输出: I am local
console.log(localVar); // 报错: localVar is not defined
  • 使用 var 声明的变量具有函数作用域。

  • 函数作用域在 ES6 之前是 JavaScript 的主要作用域规则。

3. 块级作用域(Block Scope)

块级作用域是 ES6 引入的新特性,由 let 和 const 声明的变量具有块级作用域。块级作用域是指由 {} 包围的代码块(如 ifforwhile 等)。

javascript">if (true) {let blockVar = "I am block-scoped"; // 块级作用域console.log(blockVar); // 可以访问块级变量
}console.log(blockVar); // 报错: blockVar is not defined
  • 块级作用域使得变量只在当前代码块内有效,避免了变量泄露到外部作用域。

  • let 和 const 声明的变量具有块级作用域,而 var 声明的变量不具有块级作用域。

4. 模块作用域(Module Scope)

ES6 引入了模块化(import 和 export),模块作用域是指在一个模块中定义的变量或函数默认是私有的,不会污染全局作用域。

javascript">// module.js
let moduleVar = "I am module-scoped"; // 模块作用域
export function sayHello() {console.log(moduleVar);
}// main.js
import { sayHello } from './module.js';
sayHello(); // 输出: I am module-scoped
console.log(moduleVar); // 报错: moduleVar is not defined
  • 模块作用域使得代码可以更好地组织和封装,避免命名冲突。

5. 词法作用域(Lexical Scope)

词法作用域是指变量的作用域在代码编写时就已经确定,而不是在运行时确定。JavaScript 采用的是词法作用域。

javascript">let outerVar = "I am outer";function outerFunction() {let innerVar = "I am inner";function innerFunction() {console.log(outerVar); // 可以访问外部作用域的变量console.log(innerVar); // 可以访问父函数作用域的变量}innerFunction();
}outerFunction();

6. 动态作用域(Dynamic Scope)

JavaScript 本身并不支持动态作用域,但可以通过 this 或 eval 模拟动态作用域的行为。动态作用域是指变量的作用域在运行时确定。

javascript">function dynamicScope() {console.log(this.value); // 动态作用域,this 的值在运行时确定
}dynamicScope.call({ value: "I am dynamic" }); // 输出: I am dynamic

总结

ES6 中的主要作用域包括:

  1. 全局作用域:最外层作用域,变量在整个程序中可访问。

  2. 函数作用域:函数内部的作用域,变量只在函数内可访问。

  3. 块级作用域:由 {} 包围的代码块,let 和 const 声明的变量只在块内可访问。

  4. 模块作用域:模块内部的作用域,变量默认私有,不会污染全局。

  5. 词法作用域:作用域在代码编写时确定,是 JavaScript 的默认行为。

  6. 动态作用域:JavaScript 本身不支持,但可以通过 this 或 eval 模拟。

这些作用域规则使得 JavaScript 的变量管理更加灵活和安全,尤其是在大型项目中,可以有效避免变量冲突和污染。


http://www.ppmy.cn/devtools/151945.html

相关文章

STM32 HAL库函数入门指南:从原理到实践

1 STM32 HAL库概述 STM32 HAL(Hardware Abstraction Layer)库是ST公司专门为STM32系列微控制器开发的一套硬件抽象层函数库。它的核心设计理念是在应用层与硬件层之间建立一个抽象层,这个抽象层屏蔽了底层硬件的具体实现细节,为开发者提供了一套统一的、…

vue2:实现上下两栏布局,可拖拽改变高度

要拖拽改变两栏高度,那么总高度要确定,在拖拽的过程中,实时根据光标位置计算两栏高度,所以: 1、最外层有一个box, 高度是屏幕高度screenHeight; 2、该值在页面挂载时获取初始值(window.innerHeight-100),这里减少100,因为窗口上面有工具栏; 3、监听窗口resize事件…

Linux安装Docker教程(详解)

如果想要系统学习docker,建议进入官方文档中学习:docker官方文档 一. 基本概念 Docker Desktop 和 Docker Engine 有什么区别? Docker Desktop for Linux 提供用户友好的图形界面,可简化容器和服务的管理。它包括 Docker Engine&#xff0c…

力扣动态规划-2【算法学习day.96】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?建议灵神的题单和代码随想录)和记录自己的学习过程,我的解析也不会做的非常详细,只会提供思路和一些关…

NVIDIA视频编解码

开源了两个项目:英伟达显卡视频编解码、jetson视频编解码。都是基于官方SDK进行的封装,由于官方自带的demo晦涩难懂并且每块都是独立的,我对SDK进行二次封装并形成了一套较为完整的视频编解码流程,调用简单,有完整的测…

MySQL的不同SQL模式导致行为不同?

现象: 我在两个mysql库都有相同定义的表,其中一个字段是varchar(1200)。当我都对这个表进行insert操作,而且超过此字段的规定长度(此处是1200),这两库的行为是不一样的:库B是直接报错too long&…

【面试题】Spring/SpringBoot部分[2025/1/13 ~ 2025/1/19]

Spring/SpringBoot部分[2025/1/13 ~ 2025/1/19] 8. 什么是 Spring IOC/Di?9. Spring AOP默认用的是什么动态代理,两者的区别?10. 什么是 AOP?11. 看过源码吗?说下 Spring 由哪些重要的模块组成?12. 什么是循…

自己搭建远程桌面服务器-RustDesk(小白版)

1.RustDesk简介 此软件主要功能为远程各种设备(其中包括Windows、macOS、Linux、iOS、Android、Web等) 支持文件传输(可直接拷贝远程电脑的文件,类似向日葵的远程文件) 支持内网穿透(支持端口映射&#…