2010-09-19 45 views
2
var foo = 'hello'; 

var myfunc = function() { 
    console.log(foo); 
    var foo = foo || 'world'; 
    console.log(foo); 
} 

myfunc(); 

爲什麼第一個foo記錄爲'undefined'?javascript變量訪問的祕密

回答

9

因爲在實際上用「var」聲明一個變量的行是不相關的,只要它保持在同一個函數中。如果函數在其中的任何位置聲明var x,則對該名稱的任何引用都被認爲是聲明該範圍的本地範圍。

當然,通常你不引用它的聲明之前的變量,但考慮這個片段:

function foo(a) { 
    if (a) { 
    var b = "something"; 
    } 
    console.log(b); 
} 

可變b是局部的作用,因此不管的a值,使用b韓元的不會無意中引用在封閉範圍上聲明的變量。

注:javascript只有函數級別範圍,它沒有塊級別範圍。

+1

+1,完全正確。更多信息:http://blog.niftysnippets.org/2008/03/poor-misunderstood-var.html – 2010-09-19 11:06:15

+0

爲什麼你會在剛剛添加的代碼段中執行所做的操作?引入維護問題並沒有真正的好處。 – 2010-09-19 11:10:58

+0

不,編譯器看到一個'var foo'語句並將foo編譯爲局部變量。然後,在解釋代碼時,foo尚未定義爲具有任何值。因此它的價值是'未定義的'。請記住,有兩個階段:編譯和執行。所有變量和函數聲明都是在編譯期間處理的。但是分配必須在執行過程中發生,因爲您需要評估表達式才能獲得正確的值。 – slebetman 2010-09-19 11:18:25