2011-11-25 108 views

回答

7

在第一種情況下,變量可以在while(甚至在它之後)的任何地方訪問。在第二種情況下,它是私有的,只能在自動調用匿名函數內訪問。所以差異基本上在變量的範圍內。第二個例子似乎很複雜,沒有提供更多的上下文。

第一個例子:

while(condition) { 
    var variable; 
    ... // the variable is accessible here 
} 

// the variable is accessible here 

第二個例子:

while(condition) { 
    (function() { 
     var variable; 
     ... // the variable is accessible here 
    })(); 

    // the variable is NOT accessible here 
} 

// the variable is NOT accessible here 
+2

在第一種情況中,變量是包含同時()語句的函數內的任何地方可訪問的;它在這段時間結束時並沒有超出範圍。 –

+0

@IanClelland,對,我已經意識到這一點,並解決了我的答案。 –

+0

這其實並不完全正確。事實上,第一個例子中的變量甚至可以在while條件之外訪問。例如,Java具有您描述的本地範圍,但在JavaScript中,變量的範圍始終是功能範圍。 (有人可能希望看到與聲明作爲例外) – tec

2

變量有function scope在JavaScript中。所以在第一個循環中,variable在函數內部的任何位置都可見 - 包含while循環的函數,即。

在第二個中,variable僅在匿名函數中可見,因爲這是它聲明的函數。

2

在第一種情況下,可以在包含while的函數中的任何位置使用variable。這是因爲JavaScript沒有局部範圍,只有函數範圍。

在某些情況下這可能是不可取的,因此第二個變體將變量(和循環的主體)包含在匿名函數中。

-2

關閉考慮以及達林季米特洛夫評論。

1

自動調用函數基本上創建一個範圍。它內部定義的變量將不能在while循環之外訪問。

var i = 0; 
while (i++ == 0) { 
    var a = "hi a"; 
} 
console.log(a); //hi a 

var ii = 0; 
while (ii++ == 0) { 
    (function() { 
     var b = "hi b"; 
    })(); 
} 
console.log(b); //Uncaught ReferenceError: b is not defined 

http://jsfiddle.net/