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(window.Array); // "hello" var ncz = "Hi!"; console.log(window.ncz); // "Hi!" let RegExp = "Hello!"; console.log(RegExp); // "Hello!" console.log(window.RegExp === RegExp); // false const ncz1 = "hi"; console.log(ncz1); // "hi" console.log("ncz1" in window); //false
原文:https://www.cnblogs.com/zhanglw456/p/10480942.html