2012-03-17 129 views
3

考虑这些略显两个不同版本吊装......困惑吊装

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

这将输出“芬戈尔”,然后“芬戈尔”

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

这将输出“不确定”和“芬戈纳“

为什么?

+11

第一个应该抛出一个ReferenceError,除非'mylocation'已经在其他地方定义了。 – 2012-03-17 20:20:11

+0

@GGG。检查这[小提琴](http:// jsfiddle。net/UcrVH /) – gdoron 2012-03-17 20:29:54

+0

@gdoron很好的工作,心理侦探:D – 2012-03-17 20:32:09

回答

6

一旦您在javascript函数中使用var关键字声明变量,并且无论您将此声明放在哪里 - 在函数顶部或在buttom处,它都将被视为局部变量。因此,当您在var声明之前尝试获取此类变量的值时,您得到undefined的原因。

5

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

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

0

在JavaScript中 - 变量声明为悬挂但初始化。 这意味着当你在函数内的任何地方写入var时,它将被视为在顶部声明。所以它不会在全局空间中使用同一个名称变量。

@Ashish是对的,第一个片段应该输出“都柏林”和“芬戈尔”。

0

举个例子:

x = 5; 
var x; 

console.log(x); 

从技术上讲,你可能想在x = 5;看作在这方面考虑到它的声明之前说到的事实错误的语句,但JS引擎不工作的方式。它将x = 5var x看作是两个单独的语句,第一个是与编译器相关的任务,第二个是与执行相关的任务。

简而言之,这意味着在执行代码本身之前,在范围内的所有声明(无论它们出现在何处)都会首先进行处理。即你可以在声明它之前执行一个变量。