千家信息网

javascript中var和let有哪些区别

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍了javascript中var和let有哪些区别,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。区别:1、var有变量提
千家信息网最后更新 2026年11月03日javascript中var和let有哪些区别

这篇文章主要介绍了javascript中var和let有哪些区别,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

区别:1、var有变量提升,而let没有;2、let不允许在相同的作用域下重复声明,而var允许;3、let没有暂时性死区问题;4、let创建的全局变量没有给window设置对应的属性;5、let会产生块级作用域,var不会。

本教程操作环境:windows7系统、javascript1.8.5版、Dell G3电脑。

想要了解var(ES5)和let(ES6)区别,首先就要了解ES5下JS的变量提升

一、变量提升(声)

当浏览器开辟出供代码执行的栈内存后,代码并没有自上而下立即执行,而是继续做了一些事情:把当前作用域中所有带var/function关键字的进行提前的声明和定义 => 变量提升机制

  • 带var的只是提前声明(declare)var a;,如果只声明没有赋值,默认值是undefined
    例如:

console.log(a);var a = 13;

输出:undefined
相当于:

var a;              // 只声明没有赋值,默认为undefinedconsole.log(a);a = 13;
  • 带function的不仅声明,而且还定义了(defined),准确来说就是让变量和某个值进行关联。

二、let和var的区别

1. let和const不存在变量提升机制

创建变量的六种方式中:var/function有变量提升,而let/const/class/import都不存在这个机制

2. var允许重复声明,而let不允许重复声明

在相同的作用域(或执行上下文中)

  • 如果使用var/function关键词声明变量并且重复声明,是不会有影响的(声明第一次之后,之后再遇到就不会再重复声明了)

  • 但使用let/const就不行,浏览器会校验当前作用域中是否已经存在这个变量了,如果已经存在了,则再次基于let等重新声明就会报错

在浏览器开辟栈内存供代码自上而下执行之前,不仅有变量提升的操作,还有很多其他的操作 => "词法解析"或者"词法检测":就是检测当前即将要执行的代码是否会出现"语法错误 SyntaxError",如果出现错误,代码将不会再执行(第一行都不会执行)

console.log(1)  // => 这行代码就已经不会执行了let a = 12console.log(a)let a = 13      // => 此行出错:SyntaxError: Identifier 'a' has already been declaredconsole.log(a)

所谓重复就是:不管之前通过什么方法,只要当前栈内存中存在了这个变量,我们使用let/const等重复再声明这个变量就是语法错误。eg:

console.log(a)var a = 12let a = 13  // => SyntaxError: Identifier 'a' has already been declaredconsole.log(a)
console.log(a)let a = 13var a = 12  // => SyntaxError: Identifier 'a' has already been declaredconsole.log(a)

3. let能解决typeof检测时出现的暂时性死区问题(let比var更严谨)

console.log(a)// => ReferenceError: a is not defined

typeof a 未报错

console.log(typeof a)// =>  'undefined' 这是浏览器的bug,本应报错,因为没有a(暂时性死区)

使用let后:

console.log(typeof a)// => ReferenceError: Cannot access 'a' before initializationlet a

返回不能在a被定义之前使用它,解决暂时性死区问题。

4. let创建的全局变量没有给window设置对应的属性

首先看带var与不带var创建全局变量时的区别

/* * 不带var的:相当于给全局对象window设置了一个属性a *      window.a = 13 */a = 13console.log(a)  // => window.a 13/* * 栈内存变量存储空间 *            b * 带var的:是在全局作用域下声明了一个变量b(全局变量), * 但是在全局下声明的变量也相当于给全局对象window增加了一个对应的 * 属性b(只有全局作用域具备这个特点) */var b = 14console.log(b)console.log(window.b)



使用let创建时:

/* * 栈内存变量存储空间 *   c * 带let的:仅仅在全局作用域下声明了一个变量b(全局变量), * 并未给全局对象window增加对应的属性c */let c = 15console.log(c)                          // => 15console.log(window.c)                   // => undefined

5. let会产生块级作用域

下面代码能否实现点击某个按钮,body的背景色改为按钮对应的颜色,若不能,如何改进(腾讯)

        

答案当然是不能,因为通过var定义的变量,在for循环中的i是全局的,变量提升、3次循环过后,i=3,因为点击每个都相当于点击最后一个。

感谢你能够认真阅读完这篇文章,希望小编分享的"javascript中var和let有哪些区别"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

变量 全局 作用 代码 内存 属性 就是 暂时性 死区 浏览器 篇文章 浏览 对象 机制 错误 问题 检测 相同 关键 按钮 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海睿民互联网科技有限公司 互联网科技产业 科技互联网企业 广州百单互联网科技有限公司 科技信息互联网 中国互联网金融科技基金 无锡溥仪互联网科技有限公司 宁夏众和广鑫互联网科技有限公司 受益于互联网科技的高速发展 河南猎农互联网科技有限公司 伊宁互联网科技做什么的 美国互联网科技实力 云南省自由互联网科技有限公司 互联网营销推广黑科技 半导体是互联网高科技吗 抖集互联网科技技术咨询 容联科技互联网电商 中国新注册互联网科技 互联网科技企业文化 武汉亿视互联网科技有限公司 广东猪兼强互联网科技有限公司 互联网 科技创新 世界互联网领先科技成果 远拓互联网科技 互联网科技素材视频竖屏 互联网汽车科技小镇 哈尔滨屹滨互联网科技有限公司 北京市互联网新科技 互联网与数字科技关系 工业互联网科技创业
0