对吊装感到困惑
Confused about hoisting
考虑一下这两种略有不同的吊装方式。。。
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 = 5
和var x
视为两个独立的语句,第一个是与编译器相关的任务,第二个是与执行相关的任务。
简单地说,这意味着范围中的所有声明,无论它们出现在哪里,都会在代码本身执行之前先进行处理。即,您可以在声明变量之前执行它。
- 没有找到相关文章