2014-03-26 40 views
5

我想知道一些作用域行为。JavaScript意外变量作用域行为

例如我具有可变的和的函数:

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); 

这将显示'未定义'和'1'。为什么变量会以“未定义”出现?

+1

因为随着范围内定义的测试仍然具有未被赋值。 –

+0

请阅读有关**吊装的信息。** –

+1

[Global JavaScript变量作用域:为什么这不起作用?](http://stackoverflow.com/questions/2685388/global-javascript-variable-scope-why -doesnt-this-work) –

回答

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

+0

但在这两种情况下,我分配一个值在我的函数之前。 – geopl

+0

@geopl no - 在第二种情况下,您在警报之后分配值。这就是为什么你得到'未定义'。 – Pointy

+0

@geopl请现在检查答案,我已经添加了更多的解释 – thefourtheye

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);