3

考虑这两个稍微不同的提升版本......

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();

这将输出“未定义”和“fingal”

为什么?

4

5 回答 5

6

一旦你var在 javascript 函数中使用关键字声明变量,无论你把这个声明放在哪里——在函数的顶部或底部,它都将被视为局部变量。这就是为什么在声明undefined之前尝试获取此类变量的值时得到的原因。var

于 2012-03-17T20:33:15.247 回答
5

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

“在 JavaScript 中,变量可以在使用后声明。” 含义:JavaScript 将声明拉到var范围的顶部(无论它在哪里声明!),所以在你的第二个函数var mylocation中是隐式定义的,但在第一个警报之前没有分配,因此它undefined在那个点输出。

于 2012-03-17T20:21:25.450 回答
0

如果定义了 mylocation,则第一个片段的输出必须是“dublin”和“fingal”,否则它是一个参考错误。

更多细节 :

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

于 2012-12-11T13:42:10.577 回答
0

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

@Ashish 是对的,第一个片段应该输出“dublin”和“fingal”。

于 2015-06-20T09:23:24.637 回答
0

举个例子:

x = 5;
var x;

console.log( x );

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

简而言之,这意味着作用域中的所有声明,无论它们出现在哪里,都会在代码本身执行之前首先被处理。即你可以在声明它之前执行一个变量。

于 2017-02-25T07:04:13.173 回答