代码之家  ›  专栏  ›  技术社区  ›  CalamityAdam

使用var vs let记录全局变量会产生不同的结果

  •  2
  • CalamityAdam  · 技术社区  · 6 年前

    console.log() undefined 但是,当我在Chrome控制台中运行此代码时,输出是 Nimit Maru .
    如果我改变主意 var 第1行中的关键字 let (或 const 未定义 在两个VSCode中
    最后,如果我去掉 变量 / 关键字,并运行第1行 fullName = 'Nimit Maru'; 尼米特丸 .

    我知道 关键字通常更适合于局部范围,并且 关键字将提升到全局范围,但我不认为这解释了为什么我从一个控制台到下一个控制台得到不同的结果。鉴于这个变量是在全局范围内定义的,我认为这不会有什么不同。

    var fullName = 'Nimit Maru';
    
    let myObj = {
      fullName: 'David Yang',
      property: {
        fullName: 'Omri Bernstein',
        getFullName: function() {
          console.log(this.fullName);
        },
      },
    };
    
    let whosName = myObj.property.getFullName;
    
    whosName();
    

    enter image description here

    1 回复  |  直到 6 年前
        1
  •  2
  •   CertainPerformance    6 年前

    var 顶层的变量会自动分配给 window 对象。此行为不会发生在 let const 变量:

    var varName = 'foo';
    let letName = 'bar';
    const constName = 'baz';
    console.log(
      window.varName,
      window.letName,
      window.constName
    );

    whosName(); ,您调用它时没有调用上下文,所以 this 默认为 窗口 . 因此, this.fullName window.fullName ,只有使用 var fullName . (如果你用过 let fullName const fullName ,则不会分配给 窗口 undefined .)

    如果你想参考 fullName 财产 Omri Bernstein ),使用 bind 或者另一个调用 myObj.property.getFullName

    let myObj = {
      fullName: 'David Yang',
      property: {
        fullName: 'Omri Bernstein',
        getFullName: function() {
          console.log(this.fullName);
        },
      },
    };
    
    let whosName1 = () => myObj.property.getFullName();
    let whosName2 = myObj.property.getFullName.bind(myObj.property);
    
    whosName1();
    whosName2();

    我知道let关键字通常更适合于局部范围,var关键字将提升到全局范围

    变量 功能 范围和吊装,同时 常数 如果没有函数,则范围将被限定到其最近的周围函数或顶层。