[英]What's the scope of a Javascript variable declared in a for() loop?
[英]Scope of variable declared in for-loop, javascript
我在Eclipse中遇到錯誤:
for (var i = 0; i < foo; i++) {
...
}
...
while (someCondition) {
for (var i = 0; i < bar; i++) {
...
}
}
循環使用相同的變量名。 Eclipse給我警告'i' is already defined
。 如果我在第二個for循環中刪除var som,則不會發出警告。
AFAIK在for循環中聲明的變量(在本例中為i
)與循環的作用域相同。
Eclipse是否正確? 這些i
變量是否在同一范圍內?
JavaScript中的局部變量的作用域為封閉函數。 因此,兩個i
具有相同的范圍。
為了顯示,
function f() {
...
for (var i = ...; ...; ...) {
...
}
}
相當於
function f() {
var i;
...
for (i = ...; ...; ...) {
...
}
}
兩個i
變量都在同一范圍內,因為JavaScript變量傳統上具有functional scope
。
功能范圍是指從聲明變量的那一刻開始,變量就在聲明其的函數中為人所知。
功能范圍內的變量是這樣創建的:
var myVariable = "Some text";
功能范圍可以這樣理解:
// i IS NOT known here
function doSomething() {
// i IS NOT known here
for (var i = 0; i < bar; i++) {
// i IS known here
}
// i IS known here
}
// i IS NOT known here
現在,最新的JavaScript規范還允許使用塊Scope:從聲明變量的那一刻起,就在聲明其的塊內知道變量。
塊范圍變量是這樣創建的:
let myVariable = "Some text";
塊范圍可以這樣理解:
// i IS NOT known here
function doSomething() {
// i IS NOT known here
for (let i = 0; i < bar; i++) {
// i IS known here
}
// i IS NOT known here
}
// i IS NOT known here
要了解功能范圍和塊范圍之間的區別,請考慮以下代碼:
// i IS NOT known here
// j IS NOT known here
function loop(arr) {
// i IS NOT known here
// j IS NOT known here
for( var i = 0; i < arr.length; i++ ) {
// i IS known here
// j IS NOT known here
};
// i IS known here
// j IS NOT known here
for( let j = 0; j < arr.length; j++ ) {
// i IS known here
// j IS known here
};
// i IS known here
// j IS NOT known here
}
// i IS NOT known here
// j IS NOT known here
在這里,我們可以看到我們的變量j
僅在第一個for循環中已知,而在之前和之后都不知道。 但是,從定義變量的那一刻起,我們在整個函數中就知道它的變量i
。
今天是否可以安全使用,取決於您的環境:
如果您正在編寫服務器端JavaScript代碼( Node.js ),則可以安全地使用let
語句。
如果您正在編寫客戶端JavaScript代碼並使用轉譯器(例如Traceur ),則可以安全地使用let
語句,但是就性能而言,您的代碼可能並非最佳選擇。
如果您正在編寫客戶端JavaScript代碼並且不使用翻譯器,則需要考慮瀏覽器支持。
今天,2016年2月23日,這些瀏覽器不支持let
或僅部分支持:
有關在閱讀此答案時哪些瀏覽器支持let
語句的最新概述,請參見Can I Use
頁面 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.