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

Zemax操作40--序列模式中LD光源模拟

LD模拟

lzy750750的博客 9118

银河麒麟v10装Docker实战:在线离线安装与容器部署指南

容器技术作为现代软件交付的核心方式,通过将应用与依赖打包成镜像,实现了环境的一致性与快速部署。Docker作为最流行的容器引擎,其安装与配置是上云和国产化转型中的基础技能。在国产操作系统银河麒麟v10环境中,由于系统兼容性和网络环境的差异,Docker的部署需要特别注意在线与离线两种模式的选择。本文从基础概念出发,结合麒麟v10的实际环境,详细梳理了Docker引擎的安装、镜像加速、存储配置以及MySQL、Redis等常用容器的部署方法,并针对SELinux、cgroup驱动等常见问题给出了解决方案,帮助开

weixin_30431445的博客 143

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

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

weixin_44717047的博客 261

学生党投稿Applied Soft Computing:从导师账号登录到通讯作者设置的全流程解惑

本文详细解析了学生投稿Applied Soft Computing期刊的全流程,重点介绍了导师账号登录、通讯作者设置、作者排序调整以及开放获取费用等关键环节的避坑技巧。针对LaTeX稿件处理和财务选项选择提供了实用建议,帮助学生顺利完成SCI期刊投稿。

weixin_30352191的博客 210

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

开发框架Furion之WebApi+SqlSugar (一)

MyFurion.Model项目中,通过Nuget添加Furion、Furion.Extras.DatabaseAccessor.SqlSugar、Furion.Extras.ObjectMapper.Mapster、SqlSugarCore,同时添加对项目MyFurion.Unility的引用。在MyFurion.Start项目中,通过Nuget添加 AspNetCoreRateLimit、System.Linq.Dynamic.Core,同时添加对项目MyFurion.Application的引用。

liwan09的博客 1万+

SAPGUI 与 ADT 的时代分野:在多云架构下,谁还能代表现代 SAP 开发

摘要(149字) SAP开发工具正经历代际更迭:SAPGUI基于专有协议(NI/DIAG)的厚客户端架构难以适配多云环境,而ADT(ABAP Development Tools)通过HTTP(S)协议和Eclipse生态成为ABAP Cloud/RAP开发的唯一入口。关键差异体现在:ADT支持CDS、行为定义等云原生对象建模,天然对齐BTP的零信任网络;集成ATC、Git等DevOps工具链;而SAPGUI无法创建RAP核心对象,在跨平台、自动化方面存在硬限制。官方文档明确将ADT作为Clean Core战

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 387

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

OpenClaw 钉钉和飞书集成方案研究 & OpenClaw 研究分析报告

OpenClaw(原名 Clawdbot,曾用名 Moltbot)是一款开源的个人 AI 智能体,采用"本地优先"设计理念。与传统聊天机器人不同,OpenClaw 具备真正的系统级执行能力,能够实际操作用户的计算机系统,完成各种实际任务。核心优势本地部署:所有数据存储在用户本地设备,隐私零泄露系统级执行:具备完整的系统访问权限,可执行文件操作、命令运行等全渠道交互:支持多种即时通讯平台作为交互界面开源透明:MIT 许可证,代码完全开放,社区驱动开发应用场景个人助理:日程管理、任务提醒、邮件处理。

AI天才研究院 2340

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

构建自己的 Qt 插件系统

Qt 本身提供了插件相关的技术,但并没有提供一个通用的插件框架!倘若要开发一个较大的 GUI 应用程序,并希望使其可扩展,那么拥有这样一个插件框架无疑会带来很大的好处。

青春不老,奋斗不止! 2万+

ESP8266开发之旅 基础篇① 走进ESP8266的世界

    欢迎大家来到ESP8266的世界,从现在开始,笔者将带领大家慢慢揭开ESP8266神秘的面纱。 1. 简介     从笔者的角度来说,ESP8266这个词可以理解为ESP8266EX芯片(当然,后面也有可能出现了其他芯片,这里首推ESP8266EX)以及依赖ESP8266EX芯片开发的系列模组的简称。     ESP8266EX是由乐鑫信息科技公司(Espressif)出品的一款应用于物联...

单片机菜鸟哥的博客 15万+

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

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

m0_65029152的博客 4511

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

var与let,const的区别详解

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

花落微凉梦清幽的博客 4003

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

搞懂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、付费专栏及课程。

余额充值