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

猜你喜欢

转载自www.cnblogs.com/zhanglw456/p/10480942.html