JavaScript 塊級變量
JavaScript 開發人員長期以來一直在抱怨沒有塊級變量這樣的東西。塊級變量是僅存在於塊語句上下文中的變量(例如 if
) 然後在語句完成執行後立即銷毀。您可以編寫看起來的代碼 喜歡它應該創建塊級變量,例如:
for (var i=0; i < 10; i++){
//body
}
alert(i); //10
在這個例子中,它看起來像變量 i
是 for
的塊級變量 循環(事實上,在其他語言中也會出現這種情況,例如 Java)。然而,該變量是在包含範圍內創建的,因此它仍然可以在 for
之外訪問 如警報所示循環。此代碼在功能上等同於以下代碼:
var i=0;
for (i=0; i < 10; i++){
//body
}
alert(i); //10
這就是為什麼專家更喜歡將變量都定義在函數的開頭,以消除塊級變量的錯覺。
事實證明,在一種情況下,您可以有效地創建塊級變量。 with
語句實際上創建了另一個存在變量的範圍。其工作原理的技術細節對於本次對話並不重要,但可以說它增加了在執行 with
期間可用的變量 具有給定對象屬性的語句。例如:
with(location){
alert(href);
}
在此代碼中,location
對像被傳遞到 with
語句,它自動使 location
的每個屬性 可用作內部變量。訪問 href
with
內部 塊相當於訪問 location.href
在所有方面。 with
之後 塊已完成執行,href
變量不再可用(儘管您仍然可以訪問 location.href
)。實際上,with
語句具有塊級作用域。問題是,如何實際使用它。
塊級變量的整個想法是將它們定義為有限使用,然後相信它們已被銷毀。最好聲明一堆變量在一個塊中使用,然後知道以後不能再訪問它們。這可以使用 with
有效地完成 和一個對象字面量:
//define two variables: foo and bar
with({ foo: 1, bar: 2 }){
alert(foo); //1
alert(bar); //2
}
alert(foo); //Error!
此代碼創建一個具有兩個屬性的對象字面量,foo
和 bar
並將其傳遞到 with
陳述。這樣做會在語句中創建兩個變量,foo
和 bar
,對應於對象字面量的屬性。這些變量在 with
時被銷毀 塊執行完畢。由於對象文字本身永遠不會存儲在變量中,因此一旦 with
塊也完成執行,因此不再有任何方法可以訪問這些信息。
我不確定這是否適用於重複使用,因為添加另一個範圍也會導致變量查找的性能下降,但這是對語言中未被充分認識的部分的有趣使用。