如果JavaScript中的变量定义了两次,那么解释器应该采用哪种定义?

如果JavaScript中的变量定义了两次,那么解释器应该采用哪种定义?,javascript,function,scope,var,hoisting,Javascript,Function,Scope,Var,Hoisting,我是JavaScript新手,正在尝试理解提升和范围的概念 案例1 var名称; 函数日志名(num){ console.log(名称,num); } 日志名(1); name=“Auro”; 日志名(2)作为我可以说的其他答案的补充,那就是不要使用var,而是使用ES6let或const,“令人惊讶的行为”将消失 let name; 函数日志名(num){ console.log(名称,num); } 日志名(1); name=“Auro”; 日志名(2); name=“班纳”作为我可以说

我是JavaScript新手,正在尝试理解提升和范围的概念

案例1

var名称;
函数日志名(num){
console.log(名称,num);
}
日志名(1);
name=“Auro”;

日志名(2)
作为我可以说的其他答案的补充,那就是不要使用
var
,而是使用ES6
let
const
,“令人惊讶的行为”将消失

let name;
函数日志名(num){
console.log(名称,num);
}
日志名(1);
name=“Auro”;
日志名(2);

name=“班纳”
作为我可以说的其他答案的补充,那就是不要使用
var
,而是使用ES6
let
const
,“令人惊讶的行为”将消失

let name;
函数日志名(num){
console.log(名称,num);
}
日志名(1);
name=“Auro”;
日志名(2);

name=“班纳”
在全局范围内,
name
指的是
window.name
,这是窗口的
name
属性,在您给出的示例中是
sif1
sif2
(可能是“Snippet IFrame 1/2”)

由于
window.name
已经存在,
var name不执行任何操作。变量已定义


直到覆盖它-请注意,您再次设置了全局
window.name
属性。而且,根据浏览器设置,这可能会在重新加载页面时保持不变(因为您正在命名整个
窗口
)。这解释了为什么您会看到值“stick”。在全局范围内,
name
指的是
window.name
,这是窗口的
name
属性,在您给出的示例中是
sif1
sif2
(可能是“Snippet IFrame 1/2”)

由于
window.name
已经存在,
var name不执行任何操作。变量已定义


直到覆盖它-请注意,您再次设置了全局
window.name
属性。而且,根据浏览器设置,这可能会在重新加载页面时保持不变(因为您正在命名整个
窗口
)。这解释了为什么会看到值“stick”。

没有任何指定的输出匹配,因为最初的
name
值等于,所以
name
变量的值最初将等于
winow.name
,一旦覆盖它,就会得到新值

让我们了解这一切是如何运作的

您可以理解代码执行有两个阶段

  • 创建阶段
  • 执行阶段
  • 创建阶段:-在创建阶段,函数按原样在顶部提升,而变量被提升,但没有分配给它的值(或者可以说它的值未定义)

    执行阶段:-在执行上下文期间,当变量到达赋值发生的行时,它将值赋值给变量

    var名称;
    函数日志名(num){
    console.log(名称,num);
    }
    日志名(1);
    name=“Auro”;
    日志名(2);
    
    name=“班纳”
    没有指定的输出匹配,因为最初您的
    name
    值等于,所以最初
    name
    变量的值将等于
    winow.name
    ,一旦覆盖它,您将获得新值

    让我们了解这一切是如何运作的

    您可以理解代码执行有两个阶段

  • 创建阶段
  • 执行阶段
  • 创建阶段:-在创建阶段,函数按原样在顶部提升,而变量被提升,但没有分配给它的值(或者可以说它的值未定义)

    执行阶段:-在执行上下文期间,当变量到达赋值发生的行时,它将值赋值给变量

    var名称;
    函数日志名(num){
    console.log(名称,num);
    }
    日志名(1);
    name=“Auro”;
    日志名(2);
    
    name=“班纳”
    first log不输出
    Auro 1
    在这两个示例中,我都没有得到您声称得到的结果。您是否在控制台中多次测试这些结果?如果是的话,我猜上次运行时,
    name
    仍然存在。这里的问题是变量名不好@代码狂热是真的。第一个日志不会输出,只有重新运行才会输出。感谢您在第一个日志中指出这一点。不要输出
    Auro 1
    。在这两个示例中,我都没有得到您声称得到的结果。您是否在控制台中多次测试这些?如果是的话,我猜上次运行时,
    name
    仍然存在。这里的问题是变量名不好@代码狂热是真的。第一个日志不会输出,只有重新运行才会输出。谢谢你指出它,请在iframe名称上大声呼喊。当我更新问题使其成为片段时,这让我陷入了一个循环,^ ^如果你按两次蓝色的“Run…”按钮,浏览器也会在你的计算机中打开新的选项卡——或者它只在我的本地浏览器中工作?@KamilKiełczewski,这可能是因为,重命名了
    window.name
    ,“Run”按钮无法再找到具有所需名称的框架,因此打开了一个新窗口/选项卡-具有该名称。很好地调用了iframe名称。当我更新问题使其成为片段时,这让我陷入了一个循环,^ ^如果你按两次蓝色的“Run…”按钮,浏览器也会在你的计算机中打开新的选项卡——或者它只在我的本地浏览器中工作?@KamilKiełczewski,这可能是因为,重命名了
    window.name
    ,“Run”按钮无法再找到具有所需名称的框架,因此将打开一个具有该名称的新窗口/选项卡。