2011-03-16 62 views
1

有誰知道爲什麼在下面的代碼中的最後警報抱怨a未定義。不應該是11,因爲它在4()中初始化而不使用var關鍵字?謝謝。有關javascript的var關鍵字的問題

function three() { 
    var a = 12 
    function four() { 
    a = 11 
    function five() { 
     alert(a) 
    } 
    return five 
    } 
    return four 
} 
three()()() 
alert(a) 

回答

2

沒有,因爲一個已經被宣佈爲「無功」,分配到四個()是指聲明的變量,和的範圍限制爲3個()。

0

由於範圍問題,最後一次警報抱怨未定義。由於在函數中聲明瞭a,因此最後一行(您的alert語句)完全不瞭解a。

0
function three() { 
    var a = 12 
    function four() { 
     a = 11 
     function five() { 
      alert(a) 
     } 
    return five 
    } 
return four 
} 
three()()() 
alert(a)  

簡而言之,a沒有定義,因爲好,它沒有定義。

您的函數外部沒有變量a。爲了簡化它,一組曲線內的東西不在這組曲線之外存在。

你可以在函數之前定義它或把它傳遞到函數來解決這個

function three() { 
    a = 12 
    function four() { 
     a = 11 
     function five() { 
      alert(a) 
     } 
    return five 
    } 
return four 
} 
three()()() 
alert(a)  

編輯發表評論: Variables declared without var are always global,所以在3擺脫了var會做到這一點。

+0

值。這是爲什麼? – 2011-03-16 04:56:10

+0

沒有var聲明的變量總是全局範圍 – sclarson 2011-03-16 05:01:04

1

var a是在功能局部範圍three()

0

而且,由於我們正在對在JS範圍的話題,我想指出的是,沒有塊範圍在JavaScript中,唯一的功能和全球。任何時候你跳過var,這個聲明都是全球性的。這引起了很多人的警惕。

+0

好的,如果是這樣的話,爲什麼不應該是11,因爲它沒有var初始化? – 2011-03-16 04:52:46

+0

看起來這是遲到的,但我會把它放在這裏 - 就像Ernest Friedman-Hill回答的那樣,當在'four'範圍內未發現'a'時,封閉範圍被檢查並找到'a'在'三'的範圍內。但是,如果你在'three'中使用了''''而沒有'var',你會看到你期望的行爲。 – 2011-03-16 13:41:41

0

由於變量a位於函數的本地範圍three中,因此您將得到未定義的值。如果我改變VAR一個= 12到12 =內部的三個(),那麼它的工作原理

這應該給的a

function three() 
{ 
    var a = 12; 
    function four() { 
     a = 11; 
     function five() { 
      return a; 
     } 
     return five; 
    } 
    return four; 
} 

var b = three()()(); 
alert(b);