如果JavaScript中的var定义了两次,解释器应采用哪个定义?

Aur*_*uro 1 javascript scope var function hoisting

我是JavaScript的新手,正在尝试了解吊装和范围的概念。

情况1

var name;

function logName(num) {
  console.log(name, num);
}

logName(1);
name = "Auro";
logName(2);
Run Code Online (Sandbox Code Playgroud)

我在控制台中有以下输出

Auro 1
Auro 2
Run Code Online (Sandbox Code Playgroud)

如果我理解hoisting正确,那么JS引擎会首先提升变量的声明,然后自动为其赋值undefined。仅当遇到赋值(=)运算符时,它才实际为其分配预期值。

如果我的理解是正确的,则在第一次logName调用该函数时,该变量name应该已打印未定义,但它正在打印该值。

情况二

在控制台中输出:

Baner 1
Auro 2
Run Code Online (Sandbox Code Playgroud)

这让我更加困惑。在这里,对函数的第一个调用logName选择了对变量的后一个分配并打印Baner,但是,第二个调用选择了前一个分配,即Auro

这里发生了什么?我想念什么?

Nie*_*sol 5

在全局范围内,name指的是窗口window.namename属性-在您给出的示例中,该属性是sif1sif2(可能是“片段IFrame 1/2”)。

既然window.name已经存在,那么var name;在全球范围内什么也不做。该变量已定义。

覆盖之前,请注意,再次设置全局window.name属性。而且,根据浏览器设置的不同,这可以在页面重载之间持续存在(因为您要命名整个window)。这解释了为什么您看到值“ stick”。