ES6学习笔记之let与const用法实例分析


Posted in Javascript onJanuary 22, 2020

本文实例讲述了ES6学习笔记之let与const用法。分享给大家供大家参考,具体如下:

在ES6中不是var,而是通过let来声明变量,用const来声明常量,有如下一些不同:

1、let与const作用域只限于当前代码块{},而var则没有这种限制。

2、使用let、const申明的变量作用域不会被提升。例如:

console.log(str);
var str="var declare";

控制台输出undefined;因为变量申明是在任意代码执行前处理的,在代码区中任意地方声明变量和在最开始(最上面)的地方声明是一样的。也就是说,看起来一个变量可以在声明之前被使用!这种行为就是所谓的“hoisting”,也就是变量提升,看起来就像变量的声明被自动移动到了函数或全局代码的最顶上。注意:仅仅是声明提升了,定义并不会被提升。因此console.log()可以检测到str的声明,但是却没有定义,提示undefined。

console.log(str2);
let str2="let declare";

控制台报错:can't access lexical declaration `str2' before initialization,let不会把声明提升到全局之前,因此在console输出str2时会报错未声明。

3、在相同的作用域下不能申明相同的变量,利用var可以声明两次同一个变量,并且后一个会覆盖前面的声明,而let、const不可以。

4、for循环体现let的父子作用域

var btns=document.querySelectorAll('button');
for (var i=0;i<btns.length;i++){
  btns[i].οnclick=function () {
    alert("第"+i+"个按钮");
  }
}

由于var会提升作用域,当btns[i]在本代码块{}找不到i时,会找到之前的for中的i。在函数循环执行时,并没有触发onclick,i一直++到5。当任意按钮点击的时侯触发onclick,此时i==5,因此无论按那个按钮都会显示“第5个按钮”。

解决方法一:闭包处理      

var btns=document.querySelectorAll('button');
for (var i=0;i<btns.length;i++){
  (function (i) {//通过参数传递i,在另一个函数内的i
    btns[i++].οnclick=function () {
      alert("第"+i+"个按钮");
    }
  })(i);
}

闭包处理:闭包就是一个函数引用另外一个函数的变量,因为变量被引用着所以不会被回收,因此可以用来封装一个私有变量,i是另一个函数作用域内的变量,不会随着外循环而改变。

方法二:使用let的情况下,会自己区分为两个作用域,每个btns[i]内的函数对应不同的变量i

for (let i=0;i<btns.length;i++){//内部为新的let作用域
  btns[i].οnclick=function (){
    alert("第"+i+"个按钮");
  }
}

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JavaScript延迟加载
Mar 09 Javascript
javascript事件问题
Sep 05 Javascript
浅谈Javascript 执行顺序
Dec 18 Javascript
JavaScript中的console.group()函数详细介绍
Dec 29 Javascript
JS快速实现移动端拼图游戏
Sep 05 Javascript
jQuery手指滑动轮播效果
Dec 22 Javascript
浅谈js中同名函数和同名变量的执行问题
Feb 12 Javascript
Angular2 父子组件通信方式的示例
Jan 29 Javascript
详解Vue CLI3配置之filenameHashing使用和源码设计使用和源码设计
Aug 31 Javascript
详解vue项目中使用token的身份验证的简单实践
Mar 08 Javascript
详解Vue2的diff算法
Jan 06 Vue.js
小程序实现列表倒计时功能
Jan 29 Javascript
vue中js判断长时间不操作界面自动退出登录(推荐)
Jan 22 #Javascript
Vue设置长时间未操作登录自动到期返回登录页
Jan 22 #Javascript
JavaScript设计模型Iterator实例解析
Jan 22 #Javascript
Vue开发环境跨域访问问题
Jan 22 #Javascript
vue中英文切换实例代码
Jan 21 #Javascript
微信小程序点击view动态添加样式过程解析
Jan 21 #Javascript
微信小程序如何实现radio单选框单击打勾和取消
Jan 21 #Javascript
You might like
SONY ICF-SW7600的电路分析
2021/03/02 无线电
Linux下创建nginx脚本-start、stop、reload…
2014/08/03 PHP
刷新PHP缓冲区为你的站点加速
2015/10/10 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
2017/06/05 PHP
laravel 数据迁移与 Eloquent ORM的实现方法
2019/04/12 PHP
关于document.cookie的使用javascript
2008/04/11 Javascript
JavaScript DOM 学习第三章 内容表格
2010/02/19 Javascript
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
2010/04/01 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
2014/01/12 Javascript
jQuery窗口、文档、网页各种高度的精确理解
2014/07/02 Javascript
jQuery实现图片左右滚动特效
2020/04/20 Javascript
jQuery 3 中的新增功能汇总介绍
2016/06/12 Javascript
常用Javascript函数与原型功能收藏(必看篇)
2016/10/09 Javascript
Node.js连接MongoDB数据库产生的问题
2017/02/08 Javascript
详解nodejs微信公众号开发——3.封装消息响应模块
2017/04/10 NodeJs
关于在vue-cli中使用微信自动登录和分享的实例
2017/06/22 Javascript
详解用Node.js写一个简单的命令行工具
2018/03/01 Javascript
vue自定义指令之面板拖拽的实现
2019/04/14 Javascript
详解Vue、element-ui、axios实现省市区三级联动
2019/05/07 Javascript
js纯前端实现腾讯cos文件上传功能的示例代码
2019/05/14 Javascript
小程序实现图片预览裁剪插件
2019/11/22 Javascript
[02:33]2018DOTA2亚洲邀请赛赛前采访——LGD
2018/04/04 DOTA
[43:14]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
2015/04/05 Python
Python使用smtp和pop简单收发邮件完整实例
2018/01/09 Python
Python中的异常处理try/except/finally/raise用法分析
2019/02/28 Python
详解Python odoo中嵌入html简单的分页功能
2019/05/29 Python
重构Python代码的六个实例
2020/11/25 Python
Python实现Kerberos用户的增删改查操作
2020/12/14 Python
HTML5中语义化 b 和 i 标签
2008/10/17 HTML / CSS
日本小田急百货官网:Odakyu
2018/07/19 全球购物
.NET面试10题
2014/02/24 面试题
客运企业隐患排查工作方案
2014/06/06 职场文书
单位同意报考证明
2015/06/17 职场文书
2019年健身俱乐部的创业计划书
2019/08/26 职场文书
游戏《我的世界》澄清Xbox版暂无计划加入光追
2022/04/03 其他游戏