2014-03-26 50 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);