温州网站建设温州网站制作/app推广代理去哪里找

温州网站建设温州网站制作,app推广代理去哪里找,公司网站能否申请国外免费空间,推荐好的设计网站深度解析:JavaScript变量声明的演变与核心差异(var/let/隐式声明) 一、JavaScript变量声明的演进史 JavaScript的变量声明机制经历了三个阶段演进: 原始阶段(ES5及之前):仅 var 声明 隐式全局…

深度解析:JavaScript变量声明的演变与核心差异(var/let/隐式声明)


一、JavaScript变量声明的演进史

JavaScript的变量声明机制经历了三个阶段演进:

  1. 原始阶段(ES5及之前):仅 var 声明 + 隐式全局声明
  2. 现代化阶段(ES6):引入 letconst 块级作用域
  3. 严格模式阶段:通过 "use strict" 限制隐式声明
// 典型演进示例
var a = 1;         // 传统方式
b = 2;             // 危险隐式全局声明
let c = 3;         // 现代块级作用域
const d = 4;       // 不可变常量

二、三种声明方式深度对比

通过对比表格全面理解差异:

特性varlet隐式声明(如c=3)
作用域函数/全局作用域块级作用域全局作用域(严格模式报错)
变量提升提升并初始化undefined提升但不初始化(TDZ)不提升
重复声明允许禁止隐式覆盖
全局对象属性是(window.a)是(window.c)
循环中的表现共享同一变量每次迭代独立依赖执行环境
暂时性死区

三、核心差异详解
1. 作用域:变量可见性范围
  • var:函数作用域导致常见陷阱
function varTest() {for (var i = 0; i < 3; i++) {setTimeout(() => console.log(i), 100); // 输出3次3}
}
  • let:块级作用域解决闭包问题
function letTest() {for (let j = 0; j < 3; j++) {setTimeout(() => console.log(j), 100); // 输出0,1,2}
}
  • 隐式声明:污染全局命名空间
function danger() {count = 0; // 等同于window.count
}
2. 变量提升:执行前的预处理
  • var 的"伪提升"现象
console.log(hoistedVar); // undefined
var hoistedVar = 10;
  • let 的暂时性死区(TDZ)
console.log(hoistedLet); // ReferenceError
let hoistedLet = 20;
3. 重复声明:代码维护隐患
  • var 的意外覆盖
var userId = 1001;
// ...500行代码后...
var userId = "admin"; // 合法但危险
  • let 的严格检查
let sessionId = "abc123";
let sessionId = 456; // SyntaxError: Identifier 'sessionId' has already been declared

四、浏览器控制台的let重复声明之谜

在Chrome DevTools中出现的特殊现象:

let x = 10;
let x = 20; // 控制台不报错,正常执行

技术原理

  1. REPL环境特性:每个输入行被视为独立脚本块
  2. 上下文重置机制:控制台每次执行会部分重置词法环境
  3. 开发者便利性:允许快速调试时重新定义变量

注意:该行为不符合ECMAScript规范,仅在交互式控制台中存在。在正式JS文件中重复声明let变量将抛出错误。


五、最佳实践与选择策略
  1. 禁用var:除旧项目维护外,新项目全面使用let/const
  2. 优先const:约80%的变量应声明为常量
  3. 严格模式:始终使用 "use strict" 避免隐式声明
  4. 作用域最小化:在最小必要范围内声明变量
  5. 循环优化:for循环优先使用let声明迭代变量
"use strict";// 优秀实践示例
function calculate(items) {const BASE = 100; // 不可变基准值let total = 0;    // 块级作用域变量for (let i = 0; i < items.length; i++) {const item = items[i]; // 每次循环独立的常量total += item.value * item.quantity;}return total * BASE;
}

六、特殊场景处理技巧
  1. 全局变量管理:显式声明避免污染
// 替代隐式声明
window.APP_CONFIG = {}; // 明确全局属性
  1. 循环闭包优化:立即执行函数与let对比
// 传统解决方案
for (var i = 0; i < 5; i++) {(function(j) {setTimeout(() => console.log(j), 100);})(i);
}// 现代方案
for (let i = 0; i < 5; i++) {setTimeout(() => console.log(i), 100);
}

七、常见问题解答

Q1:为什么控制台允许let重复声明?
A:浏览器开发者工具的REPL特性,每个输入行视为独立模块,实际生产环境会报错。

Q2:如何检测隐式全局变量?
A:使用ESLint的no-undef规则或严格模式,隐式声明将抛出ReferenceError。

Q3:var还有存在的必要吗?
A:在维护旧代码库时需要理解var,但新项目应完全使用let/const。


八、总结与展望

JavaScript变量声明机制的演进体现了语言设计的进步:

  1. var:历史产物,存在设计缺陷
  2. let/const:现代工程化必备,提供可靠的作用域控制
  3. 隐式声明:绝对避免的危险模式

随着ES模块的普及和TypeScript的兴起,配合const优先原则,开发者可以构建出更健壮、可维护的应用程序。理解变量声明机制的底层原理,是掌握JavaScript执行上下文、闭包等高级概念的重要基础。

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

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

相关文章

C# 项目06-计算程序运行时间

实现需求 记录程序运行时间&#xff0c;当程序退出后&#xff0c;保存程序运行时间&#xff0c;等下次程序再次启动时&#xff0c;继续记录运行时间 运行环境 Visual Studio 2022 知识点 TimeSpan 表示时间间隔。两个日期之间的差异的 TimeSpan 对象 TimeSpan P_TimeSpa…

网络华为HCIA+HCIP NFV

目录 NFV关键技术&#xff1a;虚拟化 NFV关键技术&#xff1a;云化 NFV架构 NFV标准架构 ​编辑 NFV架构功能模块 NFV架构接口 NFV关键技术&#xff1a;虚拟化 在NFV的道路上&#xff0c;虚拟化是基础&#xff0c;云化是关键。传统电信网络中&#xff0c;各个网元都是…

SpringBoot实现异步调用的方法

在Java中使用Spring Boot实现异步请求和异步调用是一个常见的需求&#xff0c;可以提高应用程序的性能和响应能力。以下是实现这两种异步操作的基本方法&#xff1a; 一、异步请求&#xff08;Asynchronous Request&#xff09; 异步请求允许客户端发送请求后立即返回&#x…

使用vite新建vue3项目 以及elementui的使用 vite组件问题

项目创建 在创建项目之前我们应该在终端中输入 node -v 和 npm -v 只有它们都能正常查看版本号才说明我们之前是已经安装完成的。 接下来我们在合适的目录下输入npm create vitelatest 它会要求你输入项目的名称&#xff0c;这个名称和我们之前通过cil创建的命名规则一样。…

音频录制小妙招-自制工具-借助浏览器录一段单声道16000采样率wav格式音频

先看效果 1、打开页面 2、点击开始录音&#xff0c;弹出权限提示&#xff0c;点击“仅这次访问时允许” 3、录完后&#xff0c;点击停止 4、文件自动下载到默认目录 上代码 js 部分 document.addEventListener(DOMContentLoaded, () > {const startBtn document.getEleme…

数学建模 绘图 图表 可视化(3)

文章目录 前言二维散点图系列坐标图数据分布特征&#xff0c;Q-Q、P-P图分类图一般的曲线图峰峦图总结参考资料 前言 承接上期 数学建模 绘图 图表 可视化&#xff08;1&#xff09;的总体描述&#xff0c;这期我们继续跟随《Python 数据可视化之美 专业图表绘制指南》步伐来学…

【数据结构】栈(Stack)、队列(Queue)、双端队列(Deque) —— 有码有图有真相

目录 栈和队列 1. 栈&#xff08;Stack&#xff09; 1.1 概念 1.2 栈的使用&#xff08;原始方法&#xff09; 1.3 栈的模拟实现 【小结】 2. 栈的应用场景 1、改变元素的序列 2、将递归转化为循环 3、逆波兰表达式求值 4、括号匹配 5、出栈入栈次序匹配 6、最小栈…

【强化学习】Reward Model(奖励模型)详细介绍

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…

国家雪亮工程政策护航,互联网监控管理平台铸就安全防线

在当今社会&#xff0c;公共安全是国家发展的重要基石&#xff0c;也是人民安居乐业的基本保障。为了打造更高水平的平安中国&#xff0c;国家推出了意义深远的雪亮工程&#xff0c;并出台了一系列相关政策&#xff0c;为公共安全事业保驾护航。而互联网监控管理平台作为雪亮工…

蓝桥杯 第十天 2019国赛第4题 矩阵计数

最后一个用例超时了&#xff0c;还是记录一下 import java.util.Scanner;public class Main {static int visited[][];static int count 0;static int n,m;public static void main(String[]args) {Scanner scan new Scanner(System.in);n scan.nextInt();//2m scan.nextIn…

coding ability 展开第五幕(二分查找算法)超详细!!!!

. . 文章目录 前言二分查找搜索插入的位置思路 x的平方根思路 山脉数组的峰顶索引思路 寻找旋转排序数组中的最小值思路 总结 前言 本专栏上篇博客已经把滑动指针收尾啦 现在还是想到核心——一段连续的区间&#xff0c;有时候加上哈希表用起来很爽 今天我们来学习新的算法知识…

基于springboot的母婴商城系统(018)

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本母婴商城系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…

shell 脚本搭建apache

#!/bin/bash # Set Apache version to install ## author: yuan# 检查外网连接 echo "检查外网连接..." ping www.baidu.com -c 3 > /dev/null 2>&1 if [ $? -eq 0 ]; thenecho "外网通讯良好&#xff01;" elseecho "网络连接失败&#x…

使用OBS进行webRTC推流参考

参考腾讯云官方文档&#xff1a; 云直播 OBS WebRTC 推流_腾讯云 说明非常详细&#xff0c;分为通过WHIP和OBS插件的形式进行推流。 注意&#xff1a;通过OBS插件的形式进行推流需要使用较低的版本&#xff0c;文档里有说明&#xff0c;需要仔细阅读。

Excel 小黑第18套

对应大猫18 .txt 文本文件&#xff0c;点数据 -现有链接 -浏览更多 &#xff08;文件类型&#xff1a;可以点开文件看是什么分隔的&#xff09; 双击修改工作表名称 为表格添加序号&#xff1a;在数字那修改格式为文本&#xff0c;输入第一个序号样式&#xff08;如001&#…

快速入手-基于Django的mysql配置(三)

Django开发操作数据库更简单&#xff0c;内部提供了ORM框架。比如mysql&#xff0c;旧版本用pymysql对比较多&#xff0c;新的版本采用mysqlclient。 1、安装mysql模块 pip install mysqlclient 2、Django的ORM主要做了两件事 &#xff08;1&#xff09;CRUD数据库中的表&am…

【总结篇】java多线程,新建线程有几种写法,以及每种写法的优劣势

java多线程 新建线程有几种写法,以及每种写法的优劣势 [1/5]java多线程 新建线程有几种写法–继承Thread类以及他的优劣势[2/5]java多线程-新建线程有几种写法–实现Runnable接口以及他的优劣势[3/5]java多线程 新建线程有几种写法–实现Callable接口结合FutureTask使用以及他的…

基于YOLOv8与ByteTrack的车辆行人多目标检测与追踪系统

作者主页&#xff1a;编程千纸鹤 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参…

【芯片验证】面试题·对深度为60的数组进行复杂约束的技巧

朋友发给我的芯片验证笔试题,觉得很有意思,和大家分享一下。 面试题目 class A中一个长度为60的随机数组rand int arr[60],如何写约束使得: 1.每个元素的值都在(0,100]之间,且互不相等; 2.最少有三个元素满足勾股数要求,比如数组中包含3,4,5三个点; 请以解约束最快…

【论文阅读】Contrastive Clustering Learning for Multi-Behavior Recommendation

论文地址&#xff1a;Contrastive Clustering Learning for Multi-Behavior Recommendation | ACM Transactions on Information Systems 摘要 近年来&#xff0c;多行为推荐模型取得了显著成功。然而&#xff0c;许多模型未充分考虑不同行为之间的共性与差异性&#xff0c;以…