对吊装感到困惑

时间:2012-03-17 20:18:24

标签: javascript 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();

这将输出“undefined”和“fingal”

为什么?

5 个答案:

答案 0 :(得分:6)

在javascript函数中使用var关键字声明变量后,无论您在何处放置此声明 - 在函数顶部或按钮处,它都将被视为局部变量。因此,当您尝试在undefined声明之前获取此类变量的值时,您会获得var

答案 1 :(得分:5)

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

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

答案 2 :(得分:0)

第一个片段的输出必须是“dublin”和“fingal”,前提是mylocation已定义,否则为参考错误。

更多详情:

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

答案 3 :(得分:0)

在JavaScript中 - 变量声明是悬挂,但初始化不是。 这意味着当你在函数内的任何地方写var时,它将被视为在top中声明。所以它不会从全局空间中获取相同的名称变量。

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

答案 4 :(得分:0)

以例如:

x = 5;
var x;

console.log( x );

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

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