如果JavaScript中的变量定义了两次,那么解释器应该采用哪种定义?
我是JavaScript新手,正在尝试理解提升和范围的概念 案例1如果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=“班纳”作为我可以说
var名称;
函数日志名(num){
console.log(名称,num);
}
日志名(1);
name=“Auro”;
日志名(2)
作为我可以说的其他答案的补充,那就是不要使用var
,而是使用ES6let
或const
,“令人惊讶的行为”将消失
let name;
函数日志名(num){
console.log(名称,num);
}
日志名(1);
name=“Auro”;
日志名(2);
name=“班纳”
作为我可以说的其他答案的补充,那就是不要使用var
,而是使用ES6let
或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”按钮无法再找到具有所需名称的框架,因此将打开一个具有该名称的新窗口/选项卡。