JavaScript中var与let的区别

 更新时间:2021年12月08日 11:45:57   作者:听寒以南  
这篇文章主要介绍了JavaScript中var与let的区别,var是JavaScript刚出现时就存在的变量声明关键字,而let作为ES6才出现的变量声明关键字,无疑两者之间存在着很大的区别,下面来看看两者之间到底存在什么

前言:

varJavaScript刚出现时就存在的变量声明关键字,而let作为ES6才出现的变量声明关键字,无疑两者之间存在着很大的区别。那么具体有哪些区别呢?

1.作用域表现形式不同

var是函数作用域,let是块级作用域

{
  var monkey='熏悟空';
  let pig='猪扒盖';    
}
console.log(monkey); //输出undefined
console.log(pig); //报错:pig is not deined


由上面代码可见,let声明的变量只在其所在的代码块有效,在代码块外部无效无法访问,而var声明的变量在该代码块所在的函数作用域内都有效。

2.是否变量提升的区别

var声明的变量会进行变量提升,let声明的变量不会进行变量提升。

console.log(monkey); //undefined
var monkey='熏悟空';

console.log(pig); //报错:pig is not defined
let pig='猪扒盖'; 


同样的逻辑,为什么var声明的变量在它声明之前调用会显示未定义,而let声明的变量在声明之前调用会抛出异常呢,这就是两者在变量提升上的区别,var声明的变量存在变量提升,let声明的变量不存在变量提升。

那么什么叫变量提升呢,我这里不做概念性的描述,我只说我个人的理解,就是以上代码实际上相当于如下:

var monkey;

console.log(monkey); //undefined
monkey='熏悟空';

console.log(pig); //报错:pig is not defined
let pig='猪扒盖'; 

看见区别了吗,var声明的变量会将声明的变量提取到作用域的最上面进行定义但不赋值,赋值操作还是在你的代码处,所以你在调用var声明的变量时就是一个已经声明但是并未定义值的变量,所以调用结果就是undefined,这就是所谓的变量提升。而let定义的变量不存在这种变量提升。

3.暂时性死区上的区别

暂时性死区:如果在某一作用域内let了一个变量,如果外部作用域中有相同名称的变量,那么就算在作用域内进行了更改,也不会影响到外部作用域

具体表现如下:

for(var i=0;i<5;i++){
    setTimeout(function(){
        console.log(i)
    },1000)
}
for(let i=0;i<5;i++){
  setTimeout(function(){
     console.log(i)          
  },1000)  
}


请问这两处代码的运行结果分别是什么?

第一处代码运行完毕的结果是1s后顺序打印5个5;第二处代码运行完毕的结果是1s后顺序打印0,1,2,3,4。

请问为什么会存在这种区别?

因为第一处代码的变量i由var关键字声明,不存在关键性死区,即你在1s后setTimeout中访问到的变量i是全局上下文中for循环运行完毕之后的i,所以打印的结果全是5;

而第二处代码的变量i由let关键字声明,产生了关键性死区,存在setTimeout中的i变量是你当时存储时的i的值,这个存储区间的i不会因为外面有相同的i变量且赋了不同的值而改变,他依旧是之前存储进去的值,这就是暂时性死区的表现,也是为什么第二处代码运行完毕是顺序打印0,1,2,3,4的原因。

4.在同一个上下文中var可以重复声明,let不行

let monkey='熏悟空';
let monkey='逼马吻'; //报错:Identifier 'a' has already been declared
var pig='猪扒盖';
var pig='猪肛裂';  //正常访问,变量pig的值被替换

到此这篇关于JavaScript中var与let的区别的文章就介绍到这了,更多相关JavaScript中var与let内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaScript检测是否开启了控制台(F12调试工具)

    JavaScript检测是否开启了控制台(F12调试工具)

    通过js来检测开发者工具是否打开,防止别人恶意调试我们的代码,最近我发现还是有蛮多人去浏览那篇文章,所以这里再放出一段代码,算是个升级版吧
    2020-10-10
  • js字符串中空格和换行符(\r,\s,\n,\r\n)浅析

    js字符串中空格和换行符(\r,\s,\n,\r\n)浅析

    我们在使用字符串时经常会遇到换行问题,下面这篇文章主要给大家介绍了关于js字符串中空格和换行符(\r,\s,\n,\r\n)的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • JS实现弹出居中的模式窗口示例

    JS实现弹出居中的模式窗口示例

    这篇文章主要介绍了JS实现弹出居中的模式窗口,涉及javascript模式窗口及页面元素的动态操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • Javascript实现div层渐隐效果的方法

    Javascript实现div层渐隐效果的方法

    这篇文章主要介绍了Javascript实现div层渐隐效果的方法,涉及javascript操作页面元素与样式变化的相关技巧,需要的朋友可以参考下
    2015-05-05
  • 微信小程序webView嵌入H5的方法实例

    微信小程序webView嵌入H5的方法实例

    web-view是小程序提供的一个可以直连h5页面的组件,只要传递一个h5页面的地址,就可以在小程序里直接打开预览该h5页面,这篇文章主要给大家介绍了微信小程序webView嵌入H5的相关资料,需要的朋友可以参考下
    2021-07-07
  • Bootstrap table 定制提示语的加载过程

    Bootstrap table 定制提示语的加载过程

    bootstrap-table是在bootstrap-table的基础上写出来的,专门用于显示数据的表格插件。这篇文章主要介绍了Bootstrap table 定制提示语,需要的朋友可以参考下
    2017-02-02
  • 第三章之Bootstrap 表格与按钮功能

    第三章之Bootstrap 表格与按钮功能

    Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加快捷。本文给大家介绍Bootstrap 表格与按钮功能,感兴趣的朋友参考下吧
    2016-04-04
  • JavaScript实现Date()日期格式化的3种常用方法

    JavaScript实现Date()日期格式化的3种常用方法

    Date()日期对象是一个构造函数,必须使用new来调用创建我们的日期对象,下面这篇文章主要给大家介绍了关于JavaScript实现Date()日期格式化的3种常用方法,需要的朋友可以参考下
    2024-05-05
  • JS获取网页属性包括宽、高等等

    JS获取网页属性包括宽、高等等

    这篇文章主要介绍了JS获取网页属性包括宽、高等等,需要的朋友可以参考下
    2014-04-04
  • antDesign 自定义分页样式的实现代码

    antDesign 自定义分页样式的实现代码

    这篇文章主要介绍了antDesign 自定义分页样式的实现代码,这里用到了自定义指令,如果大家用不到可以按照自己的实际效果开发,本文通过实例代码给大家详细讲解,需要的朋友可以参考下
    2022-10-10

最新评论