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
应该已打印未定义,但它正在打印该值。
情况二
Auro 1
Auro 2
Run Code Online (Sandbox Code Playgroud)
在控制台中输出:
Baner 1
Auro 2
Run Code Online (Sandbox Code Playgroud)
这让我更加困惑。在这里,对函数的第一个调用logName
选择了对变量的后一个分配并打印Baner
,但是,第二个调用选择了前一个分配,即Auro
。
这里发生了什么?我想念什么?
在全局范围内,name
指的是窗口window.name
的name
属性-在您给出的示例中,该属性是sif1
和sif2
(可能是“片段IFrame 1/2”)。
既然window.name
已经存在,那么var name;
在全球范围内什么也不做。该变量已定义。
覆盖之前,请注意,再次设置全局window.name
属性。而且,根据浏览器设置的不同,这可以在页面重载之间持续存在(因为您要命名整个window
)。这解释了为什么您看到值“ stick”。