var、let、const 区别?

前言

在ES6规范中,出现了另外两个变量声明的的方式,那他们具体有什么区别呢?

var

为什么有var之后还引入了两个声明方式呢?

  1. JS没有块级作用域,var的作用域是整个函数体

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

    这样,明明已经跳出了for循环,却还可以访问a变量,甚至访问i变量

  2. 循环内变量过度共享

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

    第一反应大家认为这个输出是 0 1 2,其实他的输出是3 3 3

    因为他For循环运行完成时,第一个setTimeout还没开始运行,所以导致这个情况的发送。

let是更完美的var

  • let声明的变量拥有块级作用域。 也就是说用let声明的变量的作用域只是外层块,而不是整个外层函数。let 声明仍然保留了提升特性,但不会盲目提升。

  • **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';
    

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

const

  • ES6引入的第三个声明类关键词:const
  • 一句话说明白,const 就是用来定义常量的!

以下写法都是违法的

//只声明变量不赋值
const a
//重复声明变量
const a = 'a';
const a = 'b';
//给变量重新赋值
const a = 'a';
a = 'b'

参考部分资料:

作者:麻辣小隔壁
链接:https://www.jianshu.com/p/4e9cd99ecbf5