ES6 块级作用域

news2024/12/23 4:52:42

ES6之前没有块级作用域,ES5的var没有块级作用域的概念,只有function有作用域的概念,ES6的let、const引入了块级作用域。

​ ES5之前if和for都没有作用域,所以很多时候需要使用function的作用域,比如闭包。

1.1.1 什么是变量作用域

​ 变量在什么范围内可用,类似Java的全局变量和局部变量的概念,全局变量,全局都可用,局部变量只在范围内可用。ES5之前的var是没有块级作用域的概念,使用var声明的变量就是全局的。

{
	var name = 'zzz';
	console.log(name);
}
console.log(name);

​ 上述代码中{}外的console.log(name)可以获取到name值并打印出来,用var声明赋值的变量是全局变量,没有块级作用域。

1.1.2 没有块级作用域造成的问题

if块级

var func;
if(true){
	var name = 'zzz';
	func = function (){
		console.log(name);
	}
	func();
}
name = 'ttt';
func();
console.log(name);

​ 代码输出结果为'zzz','ttt','ttt',第一次调用func(),此时name=‘zzz’,在if块外将name置成‘ttt’,此时生效了,if没有块级作用域。

for块级

​ 定义五个按钮,增加事件,点击哪个按钮打印“第哪个按钮被点击了”。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>块级作用域</title>
</head>
<body>
  <button>按钮1</button>
  <button>按钮2</button>
  <button>按钮3</button>
  <button>按钮4</button>
  <button>按钮5</button>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.js">    </script>
    <script>
      // 3.没有块级作用域引起的问题:for块级
      var btns = document.getElementsByTagName("button");
      for (var i = 0; i < btns.length; i++) {
        btns[i].addEventListener('click',function (param) {
        console.log("第"+i+"个按钮被点击了");
        });
      }
    </script>
</body>
</html>

​ for块级中使用var声明变量i时,是全局变量,点击任意按钮结果都是“第五个按钮被点击了”。说明在执行btns[i].addEventListener('click',function())时,for块级循环已经走完,此时i=5,所有添加的事件的i都是5。

​ 改造上述代码,将for循环改造,由于函数有作用域,使用闭包能解决上述问题。

      // 使用闭包,函数有作用域
      for (var i = 0; i < btns.length; i++) {
        (function (i) {
          btns[i].addEventListener('click',function (param) {
            console.log("第"+i+"个按钮被点击了");
          })
        })(i);
      }

​ 结果如图所示,借用函数的作用域解决块级作用域的问题,因为有块级作用域,每次添加的i都是当前i。

 

​ 在ES6中使用let/const解决块级作用域问题,let和const有块级作用域,const定义常量,在for块级中使用let解决块级作用域问题。

 

      // ES6使用let/const
      const btns = document.getElementsByTagName("button");
      for (let i = 0; i < btns.length; i++) {
        btns[i].addEventListener('click',function (param) {
          console.log("第"+i+"个按钮被点击了");
        })
      }

​ 结果和使用闭包解决一致。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/442556.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于R语言经典地理加权回归,半参数地理加权回归、多尺度地理加权回归、地理加权主成分分析、地理加权判别分析等空间异质性数据分析

目录 专题一 地理加权回归下的描述性统计学 专题二 地理加权主成分分析 专题三 地理加权回归 专题四 高级回归与回归之外 更多推荐 以地理加权回归为基础的一系列方法&#xff1a;经典地理加权回归&#xff0c;半参数地理加权回归、多尺度地理加权回归、地理加权主成分分析…

从个人角度看什么是加密算法

什么是加密&#xff1f;从程序的角度看&#xff0c;加密就是一个函数&#xff0c;它接收明文P和密钥K作为参数&#xff0c;传入加密函数运算后&#xff0c;得到的返回值&#xff0c;称之为密文C C encrypt(P, K);而解密&#xff0c;就是对加密的逆操作。把密文C和密钥K作为参…

102. 二叉树的层序遍历【206】

难度等级&#xff1a;中等 上一篇算法&#xff1a; 215. 数组中的第K个最大元素【382】 力扣此题地址&#xff1a; 102. 二叉树的层序遍历 - 力扣&#xff08;Leetcode&#xff09; 1.题目&#xff1a;102. 二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值…

构建清晰、高效的Android应用程序:了解Android架构组件

概述 Android 架构组件是一个由 Google 推出的集成库&#xff0c;旨在使 Android 应用开发更加快捷、高效和易于维护。Android 架构组件提供了一套可扩展的 API&#xff0c;帮助开发者在编写 Android 应用时&#xff0c;更好地组织应用的代码&#xff0c;并提供了一些通用的、…

C++ | 一些你所忽略的类和对象小知识

文章目录 一、再谈构造函数1、初始化列表引入初始化的概念区分语法格式及使用注意事项 2、explict关键字单参构造函数多参构造函数 二、static成员1、面试题引入2、static特性细述3、疑难解惑4、在线OJ实训5、有关static修饰变量的一些注意要点 三、匿名对象四、友元1、友元函数…

iPhone照片太多,如何快速搜索照片?

当你在iPhone中存储了大量照片&#xff0c;如何快速找到其中的某一张照片&#xff1f;通过“照片”应用&#xff0c;你可以轻松查找特定人物、地点、事物或事件的照片。 通过标签查看&#xff1a; 轻点照片应用右下角的“搜索”&#xff0c;iOS 系统会自动将照片分类显示。 时…

java944医院医疗物资管理系统

本系统以医院业务流程为基础&#xff0c;结合考虑医疗物资的特点&#xff0c;主要包含物流信息管理系统中的后勤物资仓库管理、供应消毒物资管理、科室申请领用管理以及查询决策系统等功能。 目 录 1 1课题背景 2 2整体设计 2 2.1 设计目标 2 2.2 系统架构 3…

xorm实战——结构体映射到实现数据库操作(包含导出数据库脚本)

下载引入框架 go语言中要使用orm框架需要先下载框架&#xff0c;并引入&#xff1a; // 安装工具包 go get xorm.io/xorm//安装数据库驱动&#xff08;这里是mysql&#xff09;go get -u github.com/go-sql-driver/mysql//引入框架import ("gorm.io/driver/mysql"&…

4月26日,每日互动(个推)与您相约第六届数字中国建设峰会

4月26日-30日&#xff0c;第六届数字中国建设峰会及成果展览会将在福州隆重举行。本届峰会以“加快数字中国建设&#xff0c;推进中国式现代化”为主题&#xff0c;由国家网信办、国家发改委、科技部、工信部、国务院国资委、福建省人民政府共同主办&#xff0c;福州市人民政府…

嵌入式Linux(4):应用层和内核层数据传输

文章目录 简介1、如果在应用层使用系统IO对设备节点进行打开&#xff0c;关闭&#xff0c;读写等操作会发生什么呢&#xff1f;写个例子2、假如驱动层的file_operations里面没有实现read之类的操作函数&#xff0c;会发生什么&#xff1f;3、应用层和内核层室不能直接进行数据传…

Go语言面试题--基础语法(27)

文章目录 1.下面这段代码输出什么&#xff1f;2.下面这段代码输出什么&#xff1f;3.下面这段代码输出什么&#xff1f; 1.下面这段代码输出什么&#xff1f; func main() {var a [5]int{1, 2, 3, 4, 5}var r [5]intfor i, v : range a {if i 0 {a[1] 12a[2] 13}r[i] v}f…

ROS学习第五节——话题通信之发布

首先补充一个命令ROS计算图 rosrun rqt_graph rqt_graph 1.原理讲解 话题通信实现模型是比较复杂的&#xff0c;该模型如下图所示,该模型中涉及到三个角色: ROS Master (管理者)Talker (发布者)Listener (订阅者) ROS Master 负责保管 Talker 和 Listener 注册的信息&…

数字孪生(1)

目前接触的客户群体是做大屏展示&#xff0c;闲鱼上5元包邮的那种科技感前端&#xff08;不好意思我买了&#xff09;各路模型大整合 实景GISiOT&#xff0c;如果再来点动画就好&#xff0c;然满屏动起来&#xff0c;火灾烧起来&#xff0c;水面荡漾起来&#xff0c;工程车开起…

关于GeoServer发布的wfs服务的精度问题

本周基于arcgis/core组件&#xff0c;利用arcgis api for js 4.22版本加载GeoServer发布的同一数据源的wms和wfs服务&#xff0c;出现了偏移的问题。 分析&#xff1a;同一数据源不同的访问方式&#xff0c;出现了偏移&#xff0c;这是很严重的问题。初步判断为js api加载方式的…

2023年4月北京/江苏/深圳CDGA/CDGP数据治理专家认证考试报名

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

【社区图书馆】Go语言程序设计感想

随着 Go 语言的越来越流行&#xff0c;越来越多的人对其设计和语法进行了评价。以下是一些关于 Go 技术的感想&#xff1a; Go语言的特色&#xff1a; 没有继承多态的面向对象强一致类型interface不需要显式声明(Duck Typing)没有异常处理(Error is value)基于首字母的可访问…

大学计划《数字化转型赋能教育创新发展高峰论坛》成功举办

2023年4月8日&#xff0c;由航天科技控股集团股份有限公司&#xff08;简称“航天科技”&#xff09;主办&#xff0c;CFF上海与上海电子信息职业技术学院承办、智慧树网支持的《数字化转型赋能教育创新发展高峰论坛》线上会议顺利召开。此次会议邀请到了众多教育界专家、教学名…

Linux 文件描述符

Linux 文件描述符 Linux 中一切皆文件&#xff0c;比如 C 源文件、视频文件、Shell脚本、可执行文件等&#xff0c;就连键盘、显示器、鼠标等硬件设备也都是文件。 一个 Linux 进程可以打开成百上千个文件&#xff0c;为了表示和区分已经打开的文件&#xff0c;Linux 会给每个…

基于AT89C51单片机的电子万年历系统

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/87708258 源码获取 主要内容&#xff1a; 电子万年历系统以实时时钟芯片DS1302和AT89C52单片机为主要研究对象&#xff0c;着重进行51单片机控制系统的设计研究和如…

天梯赛 L3-025 那就别担心了

原题链接&#xff1a; PTA | 程序设计类实验辅助教学平台 题目描述&#xff1a; 下图转自“英式没品笑话百科”的新浪微博 —— 所以无论有没有遇到难题&#xff0c;其实都不用担心。 博主将这种逻辑推演称为“逻辑自洽”&#xff0c;即从某个命题出发的所有推理路径都会将结…