Mar*_*cus 3 javascript ecmascript-6
刚刚在我最近看到的一个问题中遇到了以下问题,我很好奇为什么var name并const name提供不同的输出。运行下面的代码片段,看看我的意思。
如果有什么关系name作为一个window对象的属性,然后重新申报/定义 name与const应导致一个错误,我觉得。但是,在下面的示例中,const允许将 重新声明name为数组,而var不允许。
var name = ['one', 'two', 'three', 'four', 'five'];
for (var i=0; i < name.length; i++){
document.write(name[i] + '<br>');
}Run Code Online (Sandbox Code Playgroud)
const name = ['one', 'two', 'three', 'four', 'five'];
for (var i=0; i < name.length; i++){
document.write(name[i] + '<br>');
}Run Code Online (Sandbox Code Playgroud)
那么,为什么const允许我劫持该window.name属性并将其重新分配为数组?但var不允许重新分配(保持默认string)?还是我只是以错误的方式看待它?
因为const和 一样let,是词法作用域,顶级词法作用域与全局作用域不同。这是一个类比:
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
}
Run Code Online (Sandbox Code Playgroud)
const不是劫持 window.name;它只是遮蔽它。您可以通过观察window.name保持不变的第二种情况来看到这一点。您可以将顶级代码视为在上面函数的嵌套块中:var声明放在全局范围内,但let和const声明没有。