JavaScript意外的变量范围行为

geo*_*opl 5 javascript scope global-variables

我想知道一些范围行为.

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

var test = 1;
function scope(){
    alert(test);
    test=2;
}
scope();
alert(test);
Run Code Online (Sandbox Code Playgroud)

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

var test = 1;
function scope(){
    alert(test);
    var test = 2;
}
scope();
alert(test);
Run Code Online (Sandbox Code Playgroud)

这将显示'undefined'和'1'.为什么变量是'undefined'?

the*_*eye 3

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

var test = 1;        // Global Test - GT

function scope() {
    alert(test);     // Accesses GT
    test = 2;        // Assigns to GT
}
scope();
alert(test);         // Accesses GT
Run Code Online (Sandbox Code Playgroud)

但在第二种情况下,您正在创建一个新变量,但在为其赋值之前访问它。默认情况下,所有未分配的变量都会带有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
Run Code Online (Sandbox Code Playgroud)

这种行为称为变量提升