ES6 中除了使用 var 定义变量, 还有 let,const, 定义变量.
- function getValue(condition){
- console.log(typeof value2); // undefined, 与 if 语句中的 value2 不在同一个作用域中
- //console.log(typeof v); // 临时死区, 需要先定义后使用, ReferenceError: v is not defined
- let v = "e";
- let value1;
- // let value1; // 不能重复声明 SyntaxError: Identifier 'value1' has already been declared
- if(condition){
- var value = "blue"; // var 声明的变量, 会提升为当前作用域的顶部声明的变量
- let value2 = "green"; // let 声明的变量, 具有块级作用域
- value1 = value;
- }else{
- console.log(value);
- value1 = "";
- }
- console.log(value); // 可以访问 value
- console.log(value2); // 不可以访问 value2,ReferenceError: value2 is not defined
- }
- getValue(1);
const 声明和 let 声明的 变量都具有块级作用域, 并且不能重复声明, 声明的变量不会提升至当前作用域顶端. 如果在声明之前访问使用 const,let 声明的变量.
JavaScript 引擎在扫描代码发现变量声明时, 要么将它提升至当前作用域顶部 (遇到 var 声明), 要么将声明放到临时死区 (TDZ) 中 (遇到 let 和 const 声明). 访问 TDZ 中的变量会触发运行时错误. 只有执行过变量声明语句后, 变量才会从 TDZ 重移除, 然后才能访问.
const 声明的是常量, 不可再修改, 但用 const 声明对象时, 可以修改其属性.
- const person = {
- name : "tom"
- }
- person.name = "Greg";
- person = null; //TypeError: Assignment to constant variable.
- person = {name: "Greg"}; //TypeError: Assignment to constant variable.
循环中的 let 声明, 每次迭代循环都会创建一个新变量, 并以之前迭代中同名变量的值将其初始化. for 循环和 for-in 循环中行为一致.
- var funcs = [];
- for(let i=0; i<10;i++){
- funcs.push(function(){
- console.log(i);
- });
- }
- funcs.forEach(function(func){
- func(); // 输出 0,1,....,9
- });
const 和 let 在全局作用域中, 会在全局作用域下创建一个新的绑定, 但该绑定不会添加为全局对象的属性, 不会覆盖全局变量, 而只能遮蔽它.
- var Array = "hello";
- console.log(Windows.Array); // "hello"
- var ncz = "Hi!";
- console.log(Windows.ncz); // "Hi!"
- let RegExp = "Hello!";
- console.log(RegExp); // "Hello!"
- console.log(Windows.RegExp === RegExp); // false
- const ncz1 = "hi";
- console.log(ncz1); // "hi"
- console.log("ncz1" in Windows); //false
来源: http://www.bubuko.com/infodetail-2977548.html