引入let的原因正是var的局限性,相比于var,let有以下几点优势:

  1. 作用域
    var的作用域是会提升的,var声明的变量只能是全局的或者是整个函数块的。

let则允许声明一个作用域被限制在块级中的变量、语句或者表达式。

for(var i = 0; i < 5; i++) {

}
console.log(i);

上面的代码中使用的是var,那么最终的输出结果将会是5,因为i虽然是在for循环中声明的,但是作用域会被提升到函数块的边界或者直至全局。

但是如果使用的是let,将会报错:

let1]![(E:\JavaScript\Note\image\let1.PNG)

这是因为在这里声明的i被局限于for循环这个块中,出了这个块自然就找不到i这个变量了。

需要注意的是,在程序的顶层,let并不会像var那样将声明的变量加到全局对象上去:

let2]![(E:\JavaScript\Note\image\let2.PNG)

但是。。在nodejs中var声明的变量也没有加到全局对象上,???

let t1 = 0;
var t2 = “???”;
console.log(this.t1);//undefined
console.log(this.t2);//undefined

这点以后再仔细追究。

  1. 对let块级作用域的使用:
    打印出li的序号:

如果使用var来定义循环控制变量

    var oLi =document.getElementById('test').getElementsByTagName('li');for(var i = 0; i < oLi.length; i++) {            oLi[i].onclick =function(event) {console.log(i);}}

那么在点击时输出的结果将会是相同的,都是li的个数。

如果使用let

    var oLi =document.getElementById('test').getElementsByTagName('li');for(let i = 0; i < oLi.length; i++) {            oLi[i].onclick =function(event) {console.log(i);}}

那么最终输出的结果将会是正确的。

这是为什么呢?

因为var声明的i对应的是全局变量,也就是说i是在循环之外存在的。所以每次点击都对应同一个i,而i是全局的,所以在循环结束后,i的值就已经确定了,因此每次点击出来的都是一样的。

但是如果使用了let,那么使用的将是块级作用域,也就是说,每个点击事件都会进入一个不同的块,所以每个点击都会输出正确的序号。

js中 let和var的区别相关推荐

  1. JS中 let 和var的区别

    JS中let和var 的区别 简单介绍let var的常见变量提升 ES6可以用let定义块级作用域变量 let配合for循环的独特应用 let没有变量提升与暂时性死区 let变量不能重复声明 简单介 ...

  2. uniapp 获取到js文件var一个变量怎么获取到这个变量值_浅析Js中const,let,var的区别及作用域...

    理解:let变量的作用域只能在当前函数中 js中const,let,var的区别及作用域_lianzhang861的博客-CSDN博客​blog.csdn.net 全局作用域中,用 const 和 l ...

  3. js中Let和Var的区别

    写在前面: 本文转载自:https://www.cnblogs.com/fly_dragon/p/8669057.html 作者:FlyDragon 出处:http://www.cnblogs.com ...

  4. js中let const var的区别

    1.var声明的变量会存在变量提升,而let 和 const的变量不会存在变量提升 也就是var声明的变量会被提升到他所在的作用域顶端去 // var: console.log(a) // 打印为 ' ...

  5. css里面的let,js中let和var定义变量的区别

    javascript 严格模式 第一次接触let关键字,有一个要非常非常要注意的概念就是"javascript 严格模式",比如下述的代码运行就会报错: let hello = ' ...

  6. Js中的style,currentStyle,getComputedStyle()区别

    Js中的style,currentStyle,getComputedStyle()区别  样式表有三种方式: 1.内嵌样式(inline Style)-是写在Tag里面的,内嵌样式只对所有的Tag有效 ...

  7. js中的extend的用法及其JS中substring与substr的区别

    1.    JS中substring与substr的区别 之前在项目中用到substring方法,因为C#中也有字符串的截取方法Substring方法,当时也没有多想就误以为这两种方法的使用时一样的. ...

  8. js中click()与onclick()的区别

    由一个简单示例到 js中click()与onclick()的区别 之前朋友在学习js的时候遇到一个有意思的问题. 先贴一份代码说一下代码构成 这里是html结构 <ul><li> ...

  9. js中parentNode和parentElement的区别和用法

    了解本篇的基础必须知道什么是节点,关于html dom节点知识点和节点类型的知识,分别看<js节点都有哪些类型?怎么判断是哪种节点类型?>和<js属性节点获取和移除>,下面直接 ...

最新文章

  1. 【Java网络编程(三)】TCP的使用——模拟用户登录
  2. WebAPI(part5)--排他操作
  3. python日志输出 超量 停止_linux 内存分配参数导致的 buffer_pool 分配不出来的问题排查...
  4. 免费福利 | 送你一份免费音频,让你躺着也能学习葡萄酒知识!
  5. 企业安全建设之自动化代码扫描(代码审计)
  6. Node.js:海量数据大行其道的今天 node.js 在IO方面如何异步非阻塞
  7. Python工具整合,为程序员和新手准备的 8 大 Python 工具
  8. Ecliplse安装tomcat插件
  9. 计算机网络第1章概述
  10. 自动装配的几种方式——Spring IOC/DI(四)
  11. 海康摄像头配置、国标平台接入、萤石云平台、局域网拉流方法
  12. 软件架构风格 - 虚拟机风格
  13. 精彩回顾 | NDBC 2021华为参会回顾
  14. 电脑设置了从睡眠中唤醒需要密码却没生效(已解决)
  15. 产品概念之1/4:前言 —— 有必要这么学术吗?
  16. 限制性波尔兹曼机RBM and DBN
  17. 前端学习-关于选择器的介绍和使用
  18. 自学(网站制作,FLASH,PS,3D)者,一定要看
  19. 紫林U盘解锁精灵V1.0.1
  20. 责任链模式(Chain of Responsibility) Java实现

热门文章

  1. Vue 爬坑之路(一)—— 使用 vue-cli 搭建项目
  2. p74 应急响应-winlinux 分析后门勒索病毒攻击
  3. cd命令的各种使用方法
  4. SpringBoot集成solr定时任务从数据库数据更新到sorl数据
  5. 如何选择企业邮箱?3款主流企业邮箱 全球节点都在50个以上
  6. Rector模式介绍
  7. capwap学习笔记——初识capwap(一)
  8. 《创业算法 - 技术人创业的认知升级》
  9. python爬虫之pyquary详解
  10. Python实现链表反转