对吊装感到困惑

Confused about hoisting

本文关键字:      更新时间:2023-09-26

考虑一下这两种略有不同的吊装方式。。。

mylocation = "dublin" 
function outputPosition() {
    alert(mylocation);
    mylocation = "fingal" ;
    alert(mylocation);
}
outputPosition();

这将输出"fingal",然后输出"fingal"

mylocation = "dublin" 
function outputPosition() {
    alert(mylocation);
    var mylocation = "fingal" ;
    alert(mylocation);
}
outputPosition();

这将输出"未定义"answers"fingal"

为什么?

在javascript函数中使用var关键字声明变量后,无论将此声明放在函数顶部还是底部,它都将被视为局部变量。所以这就是为什么当您试图在var声明之前获取该变量的值时,会得到undefined

在第二个选项中,通过var声明用一个新变量隐藏mylocation(我希望它是在外部范围中声明的)。

"在JavaScript中,变量可以在使用后声明。"意思是:JavaScript将var声明拉到作用域的顶部(无论声明在哪里!),因此在第二个函数中,var mylocation是隐式定义的,但在第一个警报之前没有赋值,因此它在该点输出undefined

如果定义了mylocation,则第一个snippet的输出必须是"dublin"answers"fingal",否则将是引用错误。

更多详细信息:

http://bustingseams.blogspot.in/2009/08/another-javascript-pitfall-hoisting.html

在JavaScript中,变量声明被提升,但初始化是而不是。这意味着,当您在函数内部的任何位置编写var时,它将被视为在顶部声明的。因此,它不会从全局空间中获取相同名称的变量。

@Ashish是对的,第一个片段应该输出"dublin"answers"fingal"。

以为例

x = 5;
var x;
console.log( x );

从技术上讲,考虑到x = 5;出现在声明之前,您可能希望在这种情况下将其视为一个错误的语句,但JS引擎并不是这样工作的。它将x = 5var x视为两个独立的语句,第一个是与编译器相关的任务,第二个是与执行相关的任务。

简单地说,这意味着范围中的所有声明,无论它们出现在哪里,都会在代码本身执行之前先进行处理。即,您可以在声明变量之前执行它。

相关文章:
  • 没有找到相关文章