有爭議的「with」聲明:它可以用來做好事嗎?
Alan Storm 對「with」聲明的言論引發了好奇在我們之中。雖然它的實用性很少被探索,但其潛在的陷阱仍不清楚。我們深入研究了它的使用,發現了一些合法的應用程序,同時規避了它的風險。
「with」語句的亮點
「with」語句的一個值得注意的用法是在區塊作用域內定義變數。 JavaScript 缺乏區塊作用域變量,因此很容易在迴圈和閉包中出現作用域問題。
For 循環和「with」語句
考慮以下程式碼:
for (var i = 0; i < 3; ++i) { setTimeout(function() { alert(num); }, 10); }
此程式碼旨在非同步顯示循環計數器「i」。但是,它失敗了,因為 JavaScript 不會為每次迭代引入新的作用域,並且變數「num」在所有三個閉包之間共享。
使用「with」模擬區塊作用域
在ES6 廣泛使用之前,可以使用「with」語句來模擬區塊作用域:
for (var i = 0; i < 3; ++i) { with ({num: i}) { setTimeout(function() { alert(num); }, 10); } }
這段程式碼為每次迭代創建一個帶有「num」屬性的單獨對象,有效地隔離區塊範圍內的變數。
「與」的其他用途
此外模擬區塊作用域,也可以使用「with」語句for:
方便地存取物件屬性:
with (object) { property = value; }
迭代物件屬性:
with (object) { for (property in this) { // Do something with the property } }
迭代物件屬性:
意外的全域變數修改:
在「with」區塊中使用「this」可能會無意中修改全域變數。
增加程式碼複雜性:過多使用「with」會使程式碼更難以閱讀和理解瀏覽器相容性:某些瀏覽器可能不完全支援“with” 結論with 語句在特定場景下是一個有用的工具,例如模擬區塊作用域和方便地存取物件屬性。然而,在程式碼中使用它之前,應該仔細考慮它的潛在缺點。以上是JavaScript 中的「with」語句是有用的工具還是問題的根源?的詳細內容。更多資訊請關注PHP中文網其他相關文章!