在ES5之前我们都是用var定义变量,es5之后我们现在用的比较多的是let,其中const可用于定义常量,那么它们之间有什么区别呢?
在以前的 JavaScript 版本中,只有两种声明变量的方式:使用 "var" 或者直接声明一个变量而不使用任何关键字。但是,这些方式有一些不足之处,例如变量的作用域问题和提升(hoisting)问题。
一、由来
1、 作用域问题: "let" 关键字解决了 "var" 关键字的,将变量的作用域在声明它的块中。
2、变量提升问题: "let" 关键字也解决了提升问题,确保变量只在定义之后可用。
二、区别
1、var
(1)语法:Es5用于定义变量
(2)有变量提升,即未赋值的变量仍然可用,使用会得到nundefined,
例如:var a ;consoole.log(a)
(3) 函数作用域:var
声明的变量只在声明它的函数内部可见
(4)可定义全局变量:如果在函数外部声明的话,则该变量是全局变量,可以在脚本的任何地方访问
(5)不存在块级作用域:即在if
语句、for
循环等代码块内部声明的var
变量,实际上是在函数作用域中声明的
2、 let
(1)语法:Es6语法定义变量
(2)无变量提升:即未赋值的变量不可用,使用会报错
(3)块级作用域:let 声明的变量只在当前块级作用域内有效,不会影响外层作用域的变量
(4)循环中的作用域:在循环语句中使用 let 声明的变量会在每次循环迭代时创建一个新的变量,保证每次迭代时变量都是的。
(5)避免变量名冲突:使用 let 声明变量可以避免变量名冲突的问题,特别是在不同的函数或块中使用同名变量时。
(6)不允许重复声明:在同一个作用域内重复声明同名变量会报错
3、const
(1)块级作用域:const的作用域也是在块级中,和let相同。
(2)不会声明提升:同let关键字相同,const声明的变量必须在声明之后才能访问。
(3)不可更改:const声明的变量必须初始化,并且一旦赋值后就不能再更改。
注意:实际上用const定义的对象仍然是可更改的,不过如果后面更改了,vscode是会语法飘红提示的 。