const定义的变量不可以修改,而且必须初始化。
var定义的变量可以修改,如果不初始化会输出undefined,不会报错,var定义的变量没有块的概念,可以跨酷爱访问,不能跨函数访问。
let是块级作用域,函数内部使用let定义后,对函数外部无影响,let的定义只能在块作用域里访问,使用的时候必须初始化,必须赋值,只能在块作用域里访问,而且不能修改。
consloe.log(a);//输出结果为 undefined var a = 'xu'; consloe.log(a);//输出结果为 xu 过程如下:
1.var声明的变量会提升到最顶部,创建出a变量
2.创建完a变量后会初始化为undefined
3.开始执行代码
4.将变量值赋值给a变量
为什么在var声明变量之前输出这个变量为undefined的原因就一目了然了?
let a = 'xu1' { consloe.log(a);//抛出错误Uncaught ReferenceError: Cannot access 'a' before initialization let a = 'xu2'; a = 'xu3' } let a = 'xu4'//Uncaught SyntaxError: Identifier 'a' has already been declared
1.输出结果:无法在初始化之前访问 ’ a ’ 。
2.输出结果:标识符“a”已经声明
经过错误1.的提示,那么问题来了,let是会提升吗?
过程如下:
1.let声明的变量在创建过程中被提升
2.开始执行代码,但未初始化 Temporary dead zone(也就是所谓的暂时性死区)
3.初始化代码
4.在修改变量值的前提下,进行赋值
这就是为什么输出的结果为:无法在初始化之前访问 ’ a ’
错误2.使用let声明变量无法声明重复变量,所以抛出错误
let声明的作用域内,是无法再次声明同一个变量的,否则就会抛出错误
{ let xu1 = '1'; let xu1 = '1'; //抛出错误 Uncaught SyntaxError: Identifier 'xu1' has already been declared }
抛出的错误说明xu1已经被声明,无法重复声明的意思。
const a = 123; console.log(a); a = 321;//抛出错误 Uncaught TypeError: Assignment to constant variable.
输出的结果为:重新赋值了常量。也就是是你重新修改了const声明的常量的值
const 和 let只有一个区别,那就是 const 声明常量的过程只有两步:
1.创建和初始化 2.赋值过程被阻止 因为阻止赋值过程,所以无法给const声明的常量进行重新赋值,这就是为什么重新给常量赋值后会抛出错误的原因
const声明的常量是什么?
> 常量,顾名思义就是常用的变量,在判断逻辑的情况下,我们有时候需要一个固定值来作为判断条件,那么我们就会优先使用const进行声明常量,而const声明的常量阻止了这个量的修改功能,也就是说 > const声明的量只无法修改其值,故称为常量。
{ var a = 'xu1'; let b = 'xu2'; const c = 'xu3'; } console.log(a); //输出结果 xu1 console.log(b); //抛出错误 ReferenceError: b is not defined console.log(c); //抛出错误 ReferenceError: c is not defined
由此可见,const 和 let 声明的常量/变量只限于当前作用域,在外部作用域是无法访问到的,
那么另一个问题就来了,它们两者声明的常量/变量是否属于window呢?
let a = 'xu1' const b = 'xu2' var c = 'xu3' console.log(window.a)//undefined console.log(window.b)//undefined console.log(window.c)//xu3
看完结果后,又发现了一项它们之间的区别,在全局作用域中使用var或者不使用var声明的变量都是属于window的,而let和const不是
SE6针对变量的全局污染,变量冗余,声明混乱的情况下,在var的基础上改变出了声明变量的的另外2种方式,可以根据不同的逻辑代码块中使用不同的声明方式,在声明作用域内私有变量时,可以通过let来声明变量,在需要一个不会变更标识时,可以通过const来声明常量,在某个代码块中,需要用到这个变量时,可以通过var来声明变量,这样全局都可以访问到。
完结~