【问题标题】:const vs var and the window.name property [duplicate]const vs var 和 window.name 属性[重复]
【发布时间】:2016-09-30 00:23:25
【问题描述】:

刚刚在最近的question I was looking at 中遇到了以下内容,我很好奇为什么var nameconst name 提供不同的输出。运行下面的 sn-ps 看看我的意思。

如果它与 name 作为 window 对象属性有关,那么 重新声明/定义 nameconst 应该会导致我认为的错误。但是,在下面的示例中,const 允许将 name 重新声明为数组,而 var 不允许。

var name = ['one', 'two', 'three', 'four', 'five'];
for (var i=0; i < name.length; i++){
    document.write(name[i] + '<br>');
}

const name = ['one', 'two', 'three', 'four', 'five'];
for (var i=0; i < name.length; i++){
    document.write(name[i] + '<br>');
}

那么,为什么const 允许我劫持 window.name 属性并将其重新分配为数组?但是var 不允许重新分配(仍为默认string)?还是我只是看错了?

【问题讨论】:

    标签: javascript ecmascript-6


    【解决方案1】:

    因为const,和let一样,是lexically scoped,而且顶层词法作用域和全局作用域不一样。打个比方:

    function f(){
      var name = 1;
      {
        var name = 2; // does not create a new variable, because name already exists at the top level of the function
      }
      console.log(name); // 2
    }
    
    function g(){
      var name = 1;
      {
        const name = 2; // creates a new variable
      }
      console.log(name); // 1
    }
    

    const 不是劫持window.name;它只是遮蔽它。您可以通过在第二种情况下观察 window.name 保持不变来看到这一点。您可以将顶级代码视为位于上述函数的嵌套块中:var 声明被置于全局范围内,但 letconst 声明却没有。

    【讨论】:

    • 还应注意let 的行为类似于const,原因相同。
    • 明白了。我知道let,但不知道const 遵循相同的约束。每天学习新东西。
    猜你喜欢
    • 1970-01-01
    • 2020-05-21
    • 2018-03-13
    • 2021-09-21
    • 2019-09-10
    • 1970-01-01
    • 2021-02-14
    • 2012-01-07
    • 2017-08-29
    相关资源
    最近更新 更多