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

作者:麻辣小隔壁 时间:2024-05-09 15:06:17 

随着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)用户咋用都是问题。

来源:https://www.jianshu.com/p/4e9cd99ecbf5

标签:var,let,const
0
投稿

猜你喜欢

  • python pandas.DataFrame.loc函数使用详解

    2023-10-04 07:01:58
  • asp下实现代码的“运行代码”“复制代码”“保存代码”功能源码

    2011-04-14 10:39:00
  • JS+ASP实现无刷新新闻列表方法

    2007-08-22 12:44:00
  • Python使用enumerate获取迭代元素下标

    2023-03-05 01:46:31
  • PyTorch 解决Dataset和Dataloader遇到的问题

    2023-10-14 04:37:50
  • pycharm运行和调试不显示结果的解决方法

    2023-11-04 21:09:46
  • Keras 使用 Lambda层详解

    2021-08-11 20:12:40
  • Python calendar模块详情

    2023-08-20 23:04:59
  • Python实现进程同步和通信的方法

    2023-08-30 04:21:45
  • CSS扫盲(一): padding

    2009-08-04 17:58:00
  • 如何在windows下安装配置python工具Ulipad

    2023-07-25 20:38:59
  • python 实时遍历日志文件

    2021-03-30 09:26:20
  • 刚学完怎么用Python实现定时任务,转头就跑去撩妹!

    2022-07-09 06:50:02
  • Frontpage轻松下载网页或站点

    2007-10-22 13:14:00
  • Mysql主从数据库(Master/Slave)同步配置与常见错误

    2024-01-21 17:48:35
  • Linux下mysql新建账号及权限设置方法

    2024-01-22 21:38:07
  • python 绘制拟合曲线并加指定点标识的实现

    2023-07-25 20:29:51
  • 详解Vue用自定义指令完成一个下拉菜单(select组件)

    2024-05-09 15:19:06
  • jupyter notebook 自定义python解释器的过程详解

    2021-03-07 15:31:36
  • python range实例用法分享

    2021-09-28 02:54:46
  • asp之家 网络编程 m.aspxhome.com