Javascript吊装/范围

时间:2013-10-12 18:11:35

标签: javascript scope scoping hoisting

我正在学习Javascript,并且有关于提升/确定范围的问题 - 也许我错过了一些东西。

如果我定义一个全局变量,我不能在函数内引用该变量的值,因为它超出了范围?

var x = "hello";
function temp(){
     console.log(x);
}

原来是

var x = "hello";
function temp(){
    var x;
    console.log(x);
}

两个输出都未定义。全局变量的要点是什么,或者如何在函数中使用它们? - 正如我说的,我在这里失踪了! :)

还提升功能吗?但不是匿名函数?正确?

任何帮助表示赞赏!

谢谢!

2 个答案:

答案 0 :(得分:1)

吊装仅适用于局部变量(在当前范围内使用var声明的变量)。由于var中没有temp(),因此没有悬挂。

此处x将被悬挂:

var x = "hello";
function temp(){
    console.log(x); // undefined
    var x = 55
}
temp()

因为这被解释为:

var x = "hello";
function temp(){
    var x /* = undefined */
    console.log(x);
    x = 55
}
temp()

答案 1 :(得分:0)

您可以访问范围内或更高范围内定义的任何变量。如果在您的范围内重新声明了相同的变量名称,则该变量将成为覆盖另一个变量的新变量定义。

所以,举个例子:

var x = "hello";
function temp(){
     console.log(x);   // outputs "hello" when temp() is called
}

x定义在比函数更高的范围内,因此可以在函数内部使用。


在这个例子中:

var x = "hello";
function temp(){
    var x;
    console.log(x);   // outputs "undefined" when temp() is called
                      // because local var x has not been assigned a value
}

您已经定义了一个新变量x,它是函数内部的局部变量,它的值为undefined,直到您为其赋值。


术语"吊装"表示在作用域内任何位置定义的变量(例如在函数内)的行为就好像它是在函数的最开头定义的,无论声明实际出现在何处。

所以,因为吊装,这个例子:

var x = 10;
function temp() {
    x = 3;
    y = 4;
    var x;
    console.log(x);
}

的行为与此类似,函数中对x的所有引用都是x的本地版本:

var x = 10;
function temp() {
    var x;
    x = 3;
    y = 4;
    console.log(x);
}