关于变量的定义es6之前我们使用var去声明一个变量。
es6开始引入了let、const来声明变量
那么这种跟传统的var有什么区别呢
总结下来主要是这个几个方面的区别:
1、作用域的区别
var temp_c = "test";
let temp_d = "test let";
(function() {
console.log("temp_c", temp_c, window.temp_c); //temp_c test test
console.log("temp_d", temp_d, window.temp_d); //temp_d test let undefined
})();
这里可以看到在全局同时用 var ,和 let 定义了一个变量,在函数也都可以同时访问到,但是这里有一个区别,就是我用 window.temp_c 访问的时候发现,用 var 定义的变量是可以直接访问的。
{
var var_a = "var_a";
let let_a = "let_a";
}
console.log("var", var_a); //var var_a
console.log("let", let_a); //let.html:19 Uncaught ReferenceError: let_a is not defined
2、变量提升
console.log("before temp_a", temp_a, window.temp_a); //temp_c test test
var temp_a = "temp_a";
console.log("after temp_a", temp_a, window.temp_a); //temp_d test let undefined
// console.log("before temp_b", temp_b);
let temp_b = "temp_b";
console.log("after temp_b", temp_b);
这里 var 定义的 temp_c 存在变量提升,第一次打出来的是undefined
let在定义之前使用会报错
3、重复声明
var var_a = "ddd";
var var_a = "ccc";
console.log("var_a", var_a);
let let_b = "ddd";
let let_b = "cc";
//Uncaught SyntaxError: Identifier 'let_b' has already been declared
4、暂时性死区
var temp_c = "test";
let temp_d = "test let";
(function() {
console.log("temp_c", temp_c, window.temp_c); //temp_c test test
//let.html:15 Uncaught ReferenceError: Cannot access 'temp_c' before initialization
let temp_c = "test";
console.log("temp_d", temp_d, window.temp_d); //temp_d test let undefined
})();
还是刚刚那个例子我在函数里面加了一个temp_c的定义