2014-02-25 78 views
4

我正在學習在JS變量的作用域的概念,發現它這個例子:該功能的變量的作用域混亂的JavaScript

(function() { 
    var foo = 1; 
    function bar() { 
     var foo = 2; 
    } 
    bar(); 
    console.log(foo) //outputs 1 
    if(true) { 
     var foo = 3; 
    } 
    console.log(foo) //outputs 3 
})(); 

輸出

1 
3 

現在我很困惑怎麼來的foo在第二個日誌中獲取值3。即使在if聲明中使用var來聲明foo時也是如此。在if中聲明的foo不應該有一個新的實例,因爲它在bar()

+1

JavaScript具有功能級範圍,而不是塊級功能。 'if'內的'var'與'var foo'的計數方式相同。 – Bergi

+0

好奇爲什麼downvoters downvoting。這不是一個壞問題。也許重複,但不壞。有些問題值得贊同和接近的投票。但之前提出的好問題應該標記爲重複。以前曾經問過的很多問題應該被標記爲重複和** upvoted!**這個問題有一個清晰簡潔的代碼示例以及一個明確表達的問題。這是一個很好的問題,雖然是重複的。鏈接的副本不*很好:它缺少代碼示例並提出了多個問題。也許它應該被封閉爲「太寬泛」。 ;) – gilly3

+0

我同意,這是一個很好的重複問題。然後,我會贊成並投票結束。 – chryss

回答

3

Javascript中只有兩種範圍;函數範圍和全局範圍。

if語句中的代碼沒有自己的範圍,因此if語句中的變量與外部語句中的變量相同。

在範圍中多次聲明一個變量不會創建多個變量。 if語句中的var關鍵字被忽略,因爲該變量已在範圍中聲明一次,所以它只是一個賦值。


還要注意,變量的聲明被提升到的範圍的頂部,因此,即使一個聲明是不執行的代碼塊內,仍然是創建該變量:

var foo = 1; // a global variable 
(function() { 
    console.log(foo) //outputs "undefined" 
    foo = 2; // sets the local variable 
    if(false) { 
    var foo = 3; // creates the local variable, but the assignment never happens 
    } 
    console.log(foo) //outputs 2 
})(); 
console.log(foo) //outputs 1 
+0

「只有兩個示波器......」第二種*類型的示波器會更準確,但要說只有兩個範圍只是令人困惑。 – gilly3

+0

@ gilly3:是的,你說得對,那就更清楚了。 – Guffa

8

if沒有引入範圍塊(我理解它在某些語言中的確存在)。在JavaScript中,只有function() {}創建一個範圍塊。

+0

「我瞭解它在某些語言中」哪些是?只是好奇... – jeremyjjbrown

+0

@jeremyjjbrown - http://en.wikipedia.org/wiki/Scope_(computer_science)#By_language – gilly3