JavaScript意外的变量范围行为

时间:2014-03-26 14:50:21

标签: javascript global-variables scope

我想了解范围行为。

例如,我有一个变量和一个函数:

var test = 1;
function scope(){
    alert(test);
    test=2;
}
scope();
alert(test);

这将显示1和2.没问题。但如果我这样做:

var test = 1;
function scope(){
    alert(test);
    var test = 2;
}
scope();
alert(test);

这将显示'undefined'和'1'。为什么变量以'undefined'形式出现?

2 个答案:

答案 0 :(得分:3)

在第一种情况下,您没有创建任何局部变量,而是访问了从全局范围定义的test

var test = 1;        // Global Test - GT

function scope() {
    alert(test);     // Accesses GT
    test = 2;        // Assigns to GT
}
scope();
alert(test);         // Accesses GT

但在第二种情况下,您正在创建一个新变量,但在为其赋值之前访问它。默认情况下,所有未分配的变量都将具有undefined

在JavaScript中,变量的作用域是声明它们的函数。因此,当您在函数中使用var variable_name时,您将创建新变量,并且该函数的所有部分都可以访问它。此外,您正在创建一个与全局变量同名的变量。当JavaScript查找变量test时,它将首先搜索函数的本地范围,然后在那里找到它。因此,将使用本地test变量。

alert(test);     // value will be `undefined` till a value is assigned.
var test = 2;    // Declared a new variable and assigned value here

此行为称为variable hoisting

答案 1 :(得分:2)

吊装:

你的第二个代码:

var test = 1;
function scope(){
    alert(test);
    var test = 2;
}
scope();
alert(test);

实际上是:

var test = 1;
function scope(){
    var test;
    alert(test);
    test = 2;
}
scope();
alert(test);

同样的问题:

var test = 1;
function scope(){
    if (typeof test =="undefined") alert(2)

    var test = 2;
}
scope();
alert(test);