JavaScript作用域经典例子详解 var与let 补充const的使用

JavaScript 中 let 与 var 的区别及 const 定义常量详解 本文主要介绍了 JavaScript 中 let 与 var 的区别,包括作用域、重复声明、预处理及变量收集等方面差异,还阐述了 let 在块级作用域有效等特性。同时介绍了 const 定义常量的内容,为理解和运用这些关键字提供了详细指导。 阅读详情
  • ES5之前因为if和for都没有块级作用域的概念,只有function有作用域,所以很多时候都必须借助于function的作用域来解决应用外面变量的问题
  • ES6中加入了let,let有if和for的块级作用域

1. 变量作用域:变量在什么范围内是可用

大括号是一个代码块

{
    var name = 'hammer';
    console.log(name);
}
console.log(name);
  • 代码块内定义的变量在代码块外也能使用
  • 代码块对于var定义的变量来说不是作用域的限制,即没有块级作用域

2. 没有块级作用域引起的问题:if的块级

var func;
if (true) {
    var name = 'hammer';

    func = function () {
        console.log(name);
    }
}

name = 'sister'

func();
  • func()调用打印的是sister
  • func()调用是为了打印if块内定义的那个name也就是hammer,但是在func()调用之前name被改掉了

3. 没有块级作用域引起的问题:for的块级

经典例子:五个按钮,点击哪个按钮就打印“按钮几被点击了”

body标签内包含五个button

<button>按钮0</button>
<button>按钮1</button>
<button>按钮2</button>
<button>按钮3</button>
<button>按钮4</button>

下面是三种不同的js写法

第一种写法:ES5中没有使用闭包(错误的)
var btns = document.getElementsByTagName('button');
for (var i = 0; i < btns.length; i++) {
     btns[i].addEventListener('click', function () {
         console.log('第' + i + '个按钮被点击');
     })
 }
  • 这样写不管点击哪个按钮,显示的都是第5个按钮被点击
  • addEventListener里面的函数被执行的时候,i已经被改掉了,js异步执行
第二种写法:ES5中使用闭包
var btns = document.getElementsByTagName('button');
for (var i = 0; i < btns.length; i++) {
    (function (num) {
        btns[i].addEventListener('click', function () {
            console.log('第' + num + '个按钮被点击');
        })
    })(i)
}
  • 闭包可以解决问题,因为函数是一个作用域
  • 但是闭包的写法不利于代码阅读,看上去很复杂
  • (function(){/* code */})();这是立即调用函数的一种写法,里面的函数表达式会被立即调用
  • 关于函数作用域
var name = 'hammer';
function abc(name) {
    console.log(name);
}

name = 'sister';
abc('aaa');
// 打印的是aaa,传入的aaa是输入abc函数的作用域的name,函数优先调用属于自己name,外面name更改不会影响函数里面,这也是形参存在的意义
// 所以上面的闭包,内部的函数有自己num,传入i之后,外面i被改掉不会对里面有影响,相当于那里有五个函数
第三种写法:ES6中的let
const btns = document.getElementsByTagName('button')
for (let i = 0; i < btns.length; i++) {
    btns[i].addEventListener('click', function () {
        console.log('第' + i + '个按钮被点击');
    })
}
  • 最好的实现方式

总而言之,ES5中的var是没有块级作用域的(if/for),ES6中的let是有块级作用域的(if/for)


补充:const的使用

建议在ES6开发中,优先使用const,只有需要改变某一个标识符的时候才使用let

注意一:一旦给const修饰的标识符被赋值之后不能修改

错误示范:

const name = 'hammer';
name = 'sister';

注意二:使用const定义标识符必须进行赋值

错误示范:

const name;

注意三:常量的含义是指向的对象不能修改,但是可以改变对象内部的属性

const obj = {
    name: 'hammer',
    age: 20,
    height: 1.81
}

console.log(obj);

obj.name = 'sister';
obj.age = 40;
obj.height = 2.10;

console.log(obj);
【JS中var,let,const区别】 : / : 2. 变量提升 : / : 3. 重复声明 : / : 4. 修改值 : 基本类型(如 、)不可修改。 引用类型(如 、)可修改属性,但不能重新赋值。 三、使用建议 优先使用 : 适用于不会重新赋值的变量(如配置、常量)。 其次使用 : 适用于需要重新赋值的变量(如循环计数器)。 避免使用 : 除非在旧代码或特殊场景(如全局变量)。 四、经典问题示例 原因: 的 是全局共享的,而 的 是块级作用域,每次循环都是新的 阅读详情

相关推荐

JavaScript中的var、let和const

在JavaScript中,var、let和const是三种用于声明变量的关键字,各有各的使用规则已经作用范围,且各有不同的特性。

glx_gaolixian的博客 1336

Vue3 + Element-plus 项目自动导入报错解决方法

Vue3 + Element-plus 项目中使用 unplugin-auto-import 插件,其依赖 unimport 包引发 const name = i.as ?? i.name 错误

varBlue的博客 4825

JavaScript 中 var、let 和 const 的区别与使用场景

/ 输出0,1,2。在现代JavaScript开发中,推荐优先使用const,其次是let,尽量避免使用var。// 不会成为window.z。// 不会成为window.y。// 成为window.x。var x = 2;:函数作用域(function-scoped):存在暂时性死区(TDZ),声明前访问会报错。:块级作用域(block-scoped)

Auscy的博客 961

js中let和var定义变量的区别

let变量之前没见过,刚遇到,探探究竟。 以下转自:http://blog.youkuaiyun.com/nfer_zhuang/article/details/48781671 声明后未赋值,表现相同 (function() { var varTest; let letTest; console.log(varTest); //输出undefined ...

weixin_30889885的博客 357

1.3、云计算HCIP融合存储产品及部署

目标:描述Oceanstor V3系列存储产品系统组成及产品定位 描述Oceanstor V3硬件结构及软件架构 掌握存储系统与主机系统之间的连接 一、存储型号 低端型存储:Oceanstor 2200 2600 2800 V3/V5 终端型存储:Oceanstor 5300 5500 5600 5800 6800 V3/V5 高端型存储:Oceanstor 18000 二、Oceanstor V3系列存储系统定位 OceanStor V3系列存储系统是华为根据存储产品应用现状和存储

weixin_43666279的博客 1652

Arm Neoverse CMN-700 SLC内存系统与缓存分区技术解析

现代处理器架构中,缓存一致性协议与内存子系统设计直接影响系统性能。Arm Neoverse CMN-700采用的SLC(System Level Cache)通过16-way组相联设计实现高效数据缓存,其物理地址索引机制支持灵活的way分区配置。在软件可配置内存(OCM)模式下,SLC可作为独立内存空间使用,通过寄存器控制实现模式切换与区域锁定。缓存分区技术则通过请求源分类和way-based分配策略,满足实时性任务与吞吐量场景的不同需求。这些技术在5G基站、边缘计算等低延迟场景中具有重要应用价值,特别是C

weixin_30263073的博客 611

用let、闭包、var演示关于变量作用域的经典JavaScript案例。

用let、闭包、var演示关于变量作用域的经典JavaScript案例。

weixin_44717047的博客 261

基于STM32F103C8T6的红外循迹避障小车

编程思路:控制核心板IO口的电平(即电机驱动模块的AIN1,AIN2,BIN1,BIN2)从而控制AO1、AO2、BO1、BO2的电平高低,进而控制电机使其正转、反转、不转。由于单纯地拉高拉低电平只能让电机在转与不转的状态切换,故决定利用TIM4的两个通道分别产生两路PWM信号来控制电机速度,四个电机两个一组,同一侧的两个连接在同一个PWM上。(#include "dianji.h"文件中同时写了对循迹模块引脚的初始化)

weixin_48743503的博客 1万+

mfc中报错未声明的标识符_ES6 中的 let 和 const 两种声明方式【02】

学习要点:1.let 声明2.const 声明本节课我们来开始学习 ES6 中的 let 和 const 两种声明方式。一.let 声明1. ES6 新增了一个新的变量声明:let,它和 var 变量声明非常的类似;2. 首先创建一个块级区域,分别使用 let 和 var 声明一个变量;{ var value=10; let count=20;}console.log(v...

weixin_39965881的博客 377

精密装配机器人系列编程:ABB IRB 120_(20).编程项目设计与实施

在精密装配机器人系列编程中,项目的成功设计与实施涉及多个关键步骤。从项目需求分析到最终调试,每一个环节都需要细致的考虑和专业的技术。选择合适的编程语言、设计良好的程序结构、掌握调试技巧以及解决常见问题,都是确保机器人高效、稳定运行的重要因素。通过不断优化和改进,可以提高生产效率和产品质量,满足不断变化的生产需求。

zhubeibei168的博客 1242

python全栈入门到实战【基础篇 02】环境搭建:Python解释器与PyCharm、VSCode编辑器安装配置详解

本文详解Python环境搭建步骤。首先安装解释器(运行代码核心),需从官网下载,选3.8及以上版本(勿选2.x)。Windows安装必勾“Add Python.exe to PATH”,验证用`python --version`;Mac选universal2安装包,验证用`python3 --version`。 编辑器二选一:PyCharm社区版(免费,新手推荐),安装后需配置解释器路径;VSCode轻量,需装Python插件并选择解释器。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 5万+

let与var的区别(重点看例子)

一、变量提升 var存在变量提升,而let不存在变量提升,所以用let定义的变量一定要在声明后再使用,否则会报错。 var //var定义的变量存在变量提升,变量会把声明提升到整个作用域的最前面 //例子1 console.log(a); //undefined var c=10; //等价于 var c; console.log(a); //undefined c=10; /*-...

Emily 6204

华为od统一考试B卷【宜居星球改造计划】Java&Go 实现

XXX年,人类通过对火星的大气进行宜居改造分析,使得火星已在理论上具备人类宜居的条件,由于技术原因,无法一次性将火星大气全部改造,只能通过局部处理形式,假设将火星待改造的区域为row * column的网格每个网格有3个值,宜居区、可改造区、死亡区,使用YES、NO、NA代替,YES表示该网格已经完成大气改造,NO表示该网格未进行改造,后期可进行改造,NA表示死亡区,不作为判断是否改造完成的宜居,无法穿过 初始化下,该区域可能存在多个宜居区,并且每个宜居区能同时在每个太阳日单位向上下左右四个方向的相邻格子进

MISAYAONE的博客 1万+

JavaScript 中的 var、let 和 const 详解

var 是 JavaScript 中较早期用于声明变量的关键字。使用 var 声明变量非常简单,只需要在变量名前加上 var 关键字即可。例如:var age;age = 25;// 或者可以在声明时直接赋值let 是 ES6 引入的用于声明变量的关键字。它的基本用法与 var 类似,在变量名前加上 let 即可声明变量。例如:let age;age = 30;// 或者声明时直接赋值const 同样是 ES6 引入的关键字,用于声明常量。常量一旦声明,其值就不能再被修改。

2403_87566238的博客 8218

Vue3 - Element Plus 下拉选择器 el-select 覆盖修改 placeholder样式,解决覆盖不生效问题(支持修改文字颜色、文字大小、选择器边框、hover效果、宽高等任意样式

vue3,element-plus,el-select,下拉选择器,下拉选择框,Select选择器,deep覆盖无效怎么办,怎么修改placeholder文字颜色,选择器select修改边框样式,修改文字大小,elementPlus选择器如何覆盖hover效果,使用deep改不了样式,修改边框颜色,select去掉边框,vue3+elementPlus中select选择器如何修改placeholder文字样式,修改el-select样式,select选择器样式覆盖不了咋办,el-select如何覆盖原样式,

🏆 前端领域优质创作者 1万+

【AI黑话日日新】什么是对比学习?

模型效果高度依赖大规模、高质量的人工标注数据。数据标注不仅成本高昂、周期漫长,在医疗、工业、小众垂类等场景中,甚至难以获取足量的标注样本,严重限制了模型的泛化能力与应用边界。自监督学习的出现,为解决这一问题提供了全新思路——无需人工标注标签,而是利用数据自身的结构与内在关联,构建自生成的监督信号完成模型预训练,再通过微调适配下游任务。在众多自监督学习方法中,对比学习(Contrastive Learning)

专注:太空算力、AI infra、异构调度、大模型成本工程 730

JavaScript 作用域 与 var、let、const关键字

本文主要记录JavaScript中的作用域,以及var、let、const关键字的特点和使用场景;

m0_65029152的博客 4511

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

var与let,const的区别详解

自从ES6新增后给前端的js代码书写带来很大的变化或者便利性。其中对于变量的定义var,let,const我们就来说说之间的区别吧。 let声明变量有以下几个特点: 1.没有预解析过程(即没有变量提升,var有变量提升) 2.不可以重复声明。 3.{}代表块级作用域,let有块级作用域,var只有函数作用域。 下面我们就一一举例来说明这些问题。 预解析问题: function sa...

花落微凉梦清幽的博客 4003

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

JavaScript中var、let、const的区别 (详解)

参加了几场前端方向的校招笔试面试,发现考察var、let、const的区别及用法还是较为频繁的,所以今天在这里总结一下,巩固知识点。 在Javascript中,var、let、const都可用于变量声明。但是之前没有梳理过它们之间的区别,本文主要通过介绍var、let、const的作用域、用途和变量提升,以此来发现它们的不同之处。 JavaScript中var、let、const的区别varvar的作用域var的变量提升letlet的作用域三级目录 var 在ES6 之前,都是使用var声明变量的。let

m0_50694272的博客 3221

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

搞懂JavaScript中var和let、const的区别与使用

在ES5中我们声明变量都是使用var关键字,在ES6开始新增了两个关键字let和const。var可以算作是js早期的一个设计缺陷,所以不妨先学习更为先进的用法,再区分它们之前的区别,搞清楚let和const解决了var声明变量的什么痛点。let关键字: const关键字:使用const定义一个常量,如果尝试去修改这个常量的值的话,会报错 但如果修改的是由const定义的引用类型(例如对象),可以修改对象里面的内容 原先的name值的zzz被修改成了qqq在同一个作用域中,使用var定义变

m0_51636525的博客 2433

js中const,var,let区别与用法

今天第一次遇到const定义的变量,查阅了相关资料整理了这篇文章。主要内容是:js中三种定义变量的方式const, var, let的区别。1.const定义的变量不可以修改,而且必须初始化。1 const b = 2;//正确 2 // const b;//错误,必须初始化 3 console.log('函数外const定义b:' + b);//有输出值 4 // b = 5; 5 // co...

JHLIN的博客 11万+

深入解析JavaScript变量作用域:var、let、const全攻略

本文深入探讨了JavaScript中的变量作用域,重点分析了var、let和const三种变量声明方式的作用域特点及其在实际开发中的应用。

小L的博客 1506

深入解析JavaScript中var、let、const的块级作用域与变量提升

本文深入解析JavaScript中var、let、const的核心区别,重点阐述块级作用域与变量提升机制。通过对比var的函数作用域与let/const的块级作用域,结合经典for循环示例,揭示变量泄露问题。同时分析var的完全提升与let/const的暂时性死区差异,并提供实战选择指南,帮助开发者编写更安全、健壮的代码。

hhh00的博客 962

JavaScript 变量声明var、let、const详解

JavaScript 中的变量是松散类型的,可以保存任何类型数据,变量只不过是一个名称。JavaScript 中,可以声明变量的关键字有var、let和const。 1. var 使用var定义变量,可以保存任何类型的值。若不初始化变量,变量会保存undefined。 1. 函数级作用域 使用var定义的变量会成为包含它的函数的局部变量。 function func() { var a = 'hi'; // 局部变量 } func(); console.log(a); // ReferenceErr

火星基地 2151

JS中声明变量,使用 var、let、const的区别

1、var声明是全局作用域或函数作用域,而let和const是块作用域。2、var变量可以在其范围内更新和重新声明;let变量可以被更新但不能重新声明;const变量既不能更新也不能重新声明。3、它们都被提升到其作用域的顶端。但是,虽然使用变量undefined初始化了var变量,但未初始化let和const变量。4、尽管可以在不初始化的情况下声明var和let,但是在声明期间必须初始化const。

KevinChen2019的博客 3286

在JavaScript 中 var、let、const 的区别是什么?为什么推荐使用 let/const?

前端小伙伴们,有没有被`var`坑到怀疑人生过?比如循环里的事件监听总指向最后一个值,变量名重复声明直接覆盖,函数外声明的变量满世界跑……今天咱们就聊聊ES6的`let`和`const`,用最接地气的例子说清它们和`var`的区别,看完你就明白为什么现在前端老鸟都不用`var`了~

前端大白话 863
上一篇: Vue网课笔记(一) 初识Vue
下一篇: ES6中对象字面量的增强写法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值