1、var申明变量java
学习过JavaScript的同窗都应该知道,ES5中申明变量使用var,ES5中的var能够说是无所不能的,全部类型的变量都是由var来申明,但每每不少使用者不知道var申明的变量存在变量提高,即变量能够在申明以前使用,有时不注意申明的做用域会致使全局变量污染,特别要注意这种隐形的全局变量申明,直接没有val,好比a = 3,像这个变量a就成了全局变量,若是此时你在用var申明一个a变量,在使用过程当中隐形变量a 的值就会被覆盖,这就是容易致使全局变量污染的缘由之一,还以一个你们可能会产生误解的地方就是,所谓全局变量就是在javaScript代码中function最前边的var申明是全局变量,后面的就不是,其实var申明的变量只要不在function中就所有是全局变量,这点必定要注意。特别要说明的一点就是var申明的变量存在变量提高,咱们先来看下面一段简单的代码ide
1 console.log(a); 2 var a = 4; 3 会输出underfined,不会报错referenceError
2、let申明变量函数
今天要给你们解说的let申明变量使用跟var申明同样滴,只不过let申明的变量是只在代码块中有效,即{}中有效,看下面代码学习
1 { 2 let a = 10; 3 var b = 3; 4 } 5 console.log(a) 6 //ReferenceError:a is not defined 7 console.log(b) 8 // 3
从这段代码的运行结果能够明显的看出,let申明的变量出了代码块就没法访问,这样就必定程度上避免了全局变量污染,并且let申明的变量不存在变量提高的现象,也就是说使用let申明变量只能先声明在使用,不然就会报错,如今说的块级做用域能够称做为暂时性死区(TDZ),在这个暂时性死区中申明的变量外边没法访问。还有一点就是一个变量不容许let和var重复申明。在这里顺道给你们说一下块级做用域,ES5中只有全局做用域和函数做用域,没有块级做用域这致使不少场景不合理:spa
第一种场景:内层变量可能会覆盖外层变量;code
第二种场景:用来计数的循环变量泄露为全局变量;blog
let实际上就是为JavaScript新增了块级做用域,并且块级做用域能够嵌套。有兴趣的同窗能够去看一看ES6中的do表达式,获取代码块的返回值。ip
3、const申明变量作用域
const申明一个只读的常量,一旦申明,常量的值就不能改变,也就是说const一旦申明常量,就必须当即初始化,不能留到之后赋值,不然就会报错。io
关于ES6中let和const命令申明变量就说这么,若有错误之处,欢迎你们评论区指正讨论,感谢!