美文网首页
const let var

const let var

作者: 笃笃木鱼 | 来源:发表于2019-03-10 20:44 被阅读0次

    let

    块级作用域(一般情况下是{}内)

    function varTest() {
        var x = 1;
        if (true) {
            var x = 2;  // 同样的变量!
            console.log(x);  // 2
        }
        console.log(x);  // 2
    }
    
    function letTest() {
        let x = 1;
        if (true) {
            let x = 2;  // 不同的变量
            console.log(x);  // 2
        }
        console.log(x);  // 1
    }
    

    块级作用域特例:

    for (let expr1; expr2; expr3) statement

    此处 expr1; expr2; expr3和 statement在同一隐含域块

    解决循环中的问题

    会和闭包环境绑定

    var list = document.getElementById("list");
    
    for (let i = 1; i <= 5; i++) {
      var item = document.createElement("LI");
      item.appendChild(document.createTextNode("Item " + i));
    
      let j = i;
      item.onclick = function (ev) {
        console.log("Item " + j + " is clicked.");
      };
      list.appendChild(item);
    }
    

    会依次打印出1 2 3 4 5

    在程序或者函数的顶层,let并不会像var成为容器对象的属性

    var x = 'global';
    let y = 'global';
    console.log(this.x); // "global"
    console.log(this.y); // undefined
    

    全局let不会变为窗口对象属性

    MDN原文是top level of program and functiom,大部分理解为全局

    暂存死区Temporal dead zone

    同一作用域中,let重复定义一个变量会报错
    let声明不会被提升到当前执行上下文顶部,提前引用会报错
    块开始到变量用let初始化之前,这个变量处于“暂存死区”,ReferenceError

    const

    1.声明的同时要赋值(值不可更改)
    2.块级作用域
    3.无变量提升等(暂存死区)
    4.全局常量不会变为窗口对象属性

    var

    作用域是整个封闭函数

    hoisting:声明提升,赋值不会提升。

    把所有的变量声明移动到函数或者全局代码的开头

    可以重复声明且不会丢值

    未声明的变量直接赋值

    1.会隐式地声明为全局变量
    2.执行赋值时,才会被创建
    3.其特征值 configurable: false[ 声明的变量configurable: true]
    

    相关文章

      网友评论

          本文标题:const let var

          本文链接:https://www.haomeiwen.com/subject/xybppqtx.html