详解javascript中var与ES6规范中let、const区别与用法


Posted in Javascript onJanuary 11, 2020

随着ES6规范的到来,Js中定义变量的方法已经由单一的 var 方式发展到了 var、let、const 三种之多。var 众所周知,可那俩新来的货到底有啥新特性呢?到底该啥时候用呢?下面就是小编总结出的关于javascript中var与ES6规范中let、const区别详解

我们先来絮叨絮叨 var 方式定义变量有啥 bug ?

Js没有块级作用域

请看这样一条规则:在JS函数中的var声明,其作用域是函数体的全部。

for(var i=0;i<10;i++){
     var a = 'a';
  }
  console.log(a);

明明已经跳出 for 循环了,却还可以访问到 for 循环内定义的变量 a ,甚至连 i 都可以被放访问到,尴尬~

2.** 循环内变量过度共享 **

你可以猜一下当执行以下这段代码时会发生什么

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

在浏览器里运行一下,看看和你预想的结果是否相同?

没错,控制台输出了3个3,而不是预想的 0、1、2。

事实上,这个问题的答案是,循环本身及三次 timeout 回调均共享唯一的变量 ** i 。当循环结束执行时,i 的值为3。所以当第一个 timeout 执行时,调用的 i 当让也为 3 了。

话说到这儿,想必客官已经猜到 let 是干嘛用的。

你没猜错,就是解决这两个bug的。你尽可以把上述的两个例子中的 var 替代成 let 再运行一次。

注意:必须声明 'use strict' 后才能使用let声明变量,否则浏览并不能显示结果

let是更完美的var

let声明的变量拥有块级作用域。 也就是说用let声明的变量的作用域只是外层块,而不是整个外层函数。let 声明仍然保留了提升特性,但不会盲目提升,在示例一中,通过将var替换为let可以快速修复问题,如果你处处使用let进行声明,就不会遇到类似的bug。

let声明的全局变量不是全局对象的属性。这就意味着,你不可以通过window.变量名的方式访问这些变量。它们只存在于一个不可见的块的作用域中,这个块理论上是Web页面中运行的所有JS代码的外层块。

形如for (let x...)的循环在每次迭代时都为x创建新的绑定。

这是一个非常微妙的区别,拿示例二来说,如果一个for (let...)循环执行多次并且循环保持了一个闭包,那么每个闭包将捕捉一个循环变量的不同值作为副本,而不是所有闭包都捕捉循环变量的同一个值。

所以示例二中,也以通过将var替换为let修复bug。

这种情况适用于现有的三种循环方式:for-of、for-in、以及传统的用分号分隔的类C循环。

用let重定义变量会抛出一个语法错误(SyntaxError)。

这个很好理解,用代码说话

let a = 'a';
let a = 'b';

上述写法是不允许的,浏览器会报错,因为重复定义了。

** 在这些不同之外,let和var几乎很相似了。举个例子,它们都支持使用逗号分隔声明多重变量,它们也都支持解构特性。 **

ES6引入的第三个声明类关键词:const

一句话说明白,const 就是用来定义常量的!任何脑洞(fei)大(zhu)开(liu)的写法都是非法的

比如这样:

//只声明变量不赋值
const a
这样:
//重复声明变量
const a = 'a';
const a = 'b';

还有这样:

//给变量重新赋值
const a = 'a';
a = 'b'

再来个黑科技:

//不过不推荐这么干,实在没啥意思,常量常量,不变的才叫常量嘛~
const a = {a:'a'};
//重新赋值当然是行不通的了
a = {a:'b'};
//嘿嘿嘿科技
a.a = 'b'

const 确实没啥说的,普通用户使用完全没问题,高(dou)端(bi)用户咋用都是问题。

以上就是小编对 var、let、const 用法的一些总结,有不当之处,还请大大们指出。

更多关于Javascript ES6规范详解请查看下面的相关文章

Javascript 相关文章推荐
Javascript 中文字符串处理额外注意事项
Nov 15 Javascript
关于firefox的ElementTraversal 接口 使用说明
Nov 11 Javascript
浅谈JavaScript function函数种类
Dec 29 Javascript
jQuery页面元素动态添加后绑定事件丢失方法,非 live
Jun 16 Javascript
jQuery使用animate实现ul列表项相互飘动效果示例
Sep 16 Javascript
简单实现js选项卡切换效果
Feb 09 Javascript
JavaScript 总结几个提高性能知识点(推荐)
Feb 20 Javascript
jQuery之动画ajax事件(实例讲解)
Jul 18 jQuery
JS函数节流和函数防抖问题分析
Dec 18 Javascript
基于纯JS实现多张图片的懒加载Lazy过程解析
Oct 14 Javascript
在vue中实现清除echarts上次保留的数据(亲测有效)
Sep 09 Javascript
Vue实现简单购物车功能
Dec 13 Vue.js
jQuery实现鼠标移入显示蒙版效果
Jan 11 #jQuery
jQuery实现手风琴效果(蒙版)
Jan 11 #jQuery
jquery实现图片无缝滚动 蒙版遮蔽效果
Jan 11 #jQuery
javascript实现蒙版与禁止页面滚动
Jan 11 #Javascript
js实现蒙版效果
Jan 11 #Javascript
js实现橱窗展示效果
Jan 11 #Javascript
vue实现购物车选择功能
Jan 10 #Javascript
You might like
坏狼的PHP学习教程之第1天
2008/06/15 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
2014/08/18 PHP
php实现短信发送代码
2015/07/05 PHP
帮助避免错误的Javascript陷阱清单
2009/05/31 Javascript
csdn 论坛技术区平均给分功能
2009/11/07 Javascript
javascript OFFICE控件测试代码
2009/12/08 Javascript
JavaScript中使用构造器创建对象无需new的情况说明
2012/03/01 Javascript
使用jQuery fancybox插件打造一个实用的数据传输模态弹出窗体
2013/01/15 Javascript
JavaScript实现查找字符串中第一个不重复的字符
2014/12/29 Javascript
非常棒的jQuery图片轮播效果
2016/04/17 Javascript
BootStrap.css 在手机端滑动时右侧出现空白的原因及解决办法
2016/06/07 Javascript
AngularJS入门教程之服务(Service)
2016/07/27 Javascript
JS 组件系列之 bootstrap treegrid 组件封装过程
2017/04/28 Javascript
JS实现动态给标签控件添加事件的方法示例
2017/05/13 Javascript
解决jquery appaend元素中id绑定事件失效的问题
2017/09/12 jQuery
iphone刘海屏页面适配方法
2019/05/07 Javascript
JavaScript定时器设置、使用与倒计时案例详解
2019/07/08 Javascript
Cordova(ionic)项目实现双击返回键退出应用
2019/09/17 Javascript
JS监听组合按键思路及实现过程
2020/04/17 Javascript
JavaScript进阶(二)词法作用域与作用域链实例分析
2020/05/09 Javascript
关于better-scroll插件的无法滑动bug(2021通过插件解决)
2021/03/01 Javascript
[48:54]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第二场 6.3
2018/06/04 DOTA
浅谈python中的正则表达式(re模块)
2017/10/17 Python
一文带你了解Python中的字符串是什么
2018/11/20 Python
浅谈tensorflow 中的图片读取和裁剪方式
2020/06/30 Python
Python中猜拳游戏与猜筛子游戏的实现方法
2020/09/04 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
2020/12/11 Python
IE浏览器单独写CSS样式的几种方法
2014/10/14 HTML / CSS
文员岗位职责
2013/11/09 职场文书
工商企业管理专业自荐信范文
2014/04/12 职场文书
教师先进工作者事迹材料
2014/05/01 职场文书
实习单位证明范例
2014/11/17 职场文书
2014年学生管理工作总结
2014/12/20 职场文书
公司人事任命通知
2015/04/20 职场文书
员工考勤管理制度
2015/08/06 职场文书
mysql连接查询中and与where的区别浅析
2021/07/01 MySQL