2012-12-14 128 views
0

我已經嘗試閱讀關於該主題的其他帖子,但沒有運氣。在下面的代碼中,爲什麼f2()不能訪問在f1()中定義的變量。函數f2()是不是var「name」是全局變量?不應該f2()看到var「name」?JavaScript中變量的局部和全局範圍

function f1() { 
    var name = "david"; 
    function f2() { 
     document.writeln(name); 
    } 
    document.writeln(name); 
    }     

    f2(); // does not write out "david". 
+0

查看你的錯誤控制檯。您應該看到一條消息,如「undefined」不是函數「。 –

回答

8

您的f2()僅在f1()範圍內定義。你不能全局調用它

+2

丁定丁'+ 1' – Neal

+0

好,直接。 – 2012-12-14 19:09:04

+0

o好吧。只是在f1()中添加了f2(),它就像我想的那樣工作。謝謝。 – DEdesigns57

0

你需要閱讀Javascript閉包。

下面是你的片段的一個版本,它演示瞭如何在內部函數中訪問外部函數的變量(如果你想全局調用內部函數)。

function f1() 
{ 
    var name = "david"; 
    return function() 
    { 
     console.log(name); 
    } 
} 
var f2 = f1(); 
f2(); 
+0

你怎麼知道什麼是「正確的」? – Neal

+0

@尼爾好吧,我不能說它是正確的。但我猜測他的代碼的意圖。 – bits

+0

我猜你猜對了。 – Mathletics

1

Javascript是功能級的作用域,而不是作用域的作用域。一個函數可以訪問它的父函數變量,但不能訪問其中的函數中定義的變量。你可以從f1返回f2並且這樣稱呼它

 function f1() { 
     var name = "david"; 

     document.writeln(name); 

     return f2 

     function f2() { 
      document.writeln(name); 
     } 

     } 

var f2 = f1(); 
f2(); 
+0

正確的初始語句與問題正交。即使它*是*塊範圍,它仍然表現相同。錯誤是因爲「功能在全球範圍內並不神奇」;一個不同的話題。其他人繼續說明如何「暴露」,但以一種複雜的方式顯示一些其他的細微差別..是直接的。另外,這也會在執行'f1'時顯示「david」,這可能不是所期望的。 – 2012-12-14 19:06:57