基础: 1,const定义的变量不可以修改,而且必须初始化。 1 const b = 2;//正确 2 // const b;//错误,必须初始化 3 console.log('函数外const定义b:' + b);//有输出值 4 // b = 5; 5 // console.log('函数外修改const定义b:' + b);//无法输出 2,var定义的变量可以修改,如果不初始化会输出undefined,不会报错。 1 var a = 1; 2 // var a;//不会报错 3 console.log('函数外var定义a:' + a);//可以输出a=1 4 function change(){ 5 a = 4; 6 console.log('函数内var定义a:' + a);//可以输出a=4 7 } 8 change(); 9 console.log('函数调用后var定义a为函数内部修改值:' + a);//可以输出a=4 3,let是块级作用域,函数内部使用let定义后,对函数外部无影响。 1 let c = 3; 2 console.log('函数外let定义c:' + c);//输出c=3 3 function change(){ 4 let c = 6; 5 console.log('函数内let定义c:' + c);//输出c=6 6 } 7 change(); 8 console.log('函数调用后let定义c不受函数内部定义影响:' + c);//输出c=3
延申: 在JavaScipt中是没有块级作用域的,如果在块内使用var去声明变量,它在代码块外面仍然可见。 if (true) { var foo = 3; } console.log(foo); // 3
for (var i = 0; i < 9; i++) { var j = i; } console.log(i); // 9 console.log(j); // 8
在变量提升中,不管是var还是let,预编译过程中,都发生了变量提升,但与var不同的是,Es6对let进行了约束,其规定,在真正的词法变量声明之前,以任何方式访问let变量都是不允许的,所以从开发者角度考虑,let禁止了变量提升这一行为。
let有暂时性死区:Es6规定如果块内存在let命令,那么这个块就会形成一个封闭的作用域,并要求let变量先声明才能使用,如果在声明之前就开始使用,他并不会引用外部的变量。
var可以重复声明变量,但是let不允许在相同作用域内重复声明同一变量
我们在全局范围内使用var声明一个变量时,这个变量会自动成为全局对象的属性(在浏览器和Node.js环境下,这个全局对象分别是window和global),但let是独立存在的变量,不会成为全局对象的属性。 var a = 3; console.log(window.a); // 3
let b = 5; console.log(window.b); // undefined
const命令:以上let所介绍的规则均适用于const命令,不同的是,const声明的变量不能重新赋值,也是由于这个规则,const声明变量时必须初始化,不能留到以后赋值,所以下面的代码是不合法的 const a = 3;
a = 5; // Uncaught TypeError: Assignment to constant variable
const b; // Uncaught SyntaxError: Missing initializer in const declaration