JS中关于变量的声明、大家首先想到的肯定是var
1 var mytest = "hello world"
对于上面这样的声明相信大家已经见得太多了
那么今天博主骑着自己的宝马自行车就为了早点分享带大家了解的就是ES6声明变量的几种新方式:
1.let
2.const
那么今天我们先来说说第一种、let
let声明变量、他的用法和var类似
但是声明出来的变量只在它所在的块作用域有效
1 { 2 var test1 = "hello world"; 3 let test2 = "hello world"; 4 } 5 console.log(test1);//hello world 6 console.log(test2);//Uncaught ReferenceError: test2 is not defined
上面声明的两个变量是用var 和 let
可以看出let声明的变量只在块作用域中起了效果、出了作用域就找不到let声明的变量了
再来看一段代码
1 for (var i = 0; i < 10; i++) {} 2 console.log(i);//10 3 4 for (let j= 0;j < 10;j++) {} 5 console.log(j);//Uncaught ReferenceError: j is not defined
用var生成的变量会依然存在的、但是用let声明的变量作用域之外是找不到的
也就是说明let只会在自己的代码块作用域内有效、
有时候我们如果用var声明变量会无意之间占用一些内存,损耗性能
再说到“变量提升”的问题(我理解这个词就认为他归到闭包的一类问题)
1 console.log(mytest1); // undefined 2 console.log(mytest2); // Uncaught ReferenceError: bar is not defined 3 4 var mytest1 = 2; 5 let mytest2 = 2;
undefined和not defined 的区别大家都还清楚吗?
没清楚也没关系、我在这里再为大家解释一下
undefined是察觉有这个变量但是还没有赋值(因为我们的赋值语句在打印的下方)
not defined 是察觉压根都没有定义这个变量
所以let并不会发生"变量提升"
好了到这里先吃个明星虾
let还有这样一个特性:暂时性死区
1 var temp = 123; 2 3 if (true) { 4 temp = 'abc'; // Uncaught ReferenceError: temp is not defined 5 let temp; 6 }
ES6明确规定,如果区块中存在let
和const
命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
如果我们看到了这一特性、发现如果这样的话、typeof也是会报错的
1 typeof x; //Uncaught ReferenceError: x not defined
2 let x;
还有let的最后一个特性
let不允许在相同作用域内,重复声明同一个变量。
1 var b =4; 2 var b= 5; 3 console.log(b);//5 4 5 let a =4; 6 let a= 5; 7 console.log(a);//Uncaught SyntaxError: Identifier 'a' has already been declared
好了,对于let的一些特性和用法就先说这么多、老板又催我干活啦