ES6 let const 声明变量 块级作用域

时间:2023-03-09 07:22:06
ES6 let const 声明变量 块级作用域

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