[英]Block scope, function scope and local scope in Javascript
let
/ const
而不是var
來進行維護? (這來自Airbnb風格指南 ) 塊范圍有時與功能范圍相同嗎? 我知道函數范圍適用於函數內部的所有內容,但是不知道塊范圍是什么。
塊范圍是在一側的塊中 ,例如一切:
function foo() {
// function scope
if (condition) {
// block scope
}
}
通過第5版規范,JavaScript沒有塊范圍。 下一個規范(ECMAScript 6,又稱“ES6”),即將完成,通過let
和const
添加塊范圍。
對於Javascript,目前是否建議使用
let
/const
而不是var來進行維護?
這純粹取決於你。 let
和const
是你可以添加到腰帶的新工具。 他們沒有更換var
,如果你不希望他們。 也就是說,你聽到“ let
新的var
”很多。
用let
聲明的變量有塊作用域,用var
聲明的變量沒有。
請注意, let
和const
在野外還沒有很好的支持 。 毫不奇怪,將塊范圍添加到以前從未有過的引擎可能是非平凡的。 你可以使用像Babel這樣的轉換器,或者現在繼續使用var
。
我不確定你真的已經回答了你的問題:
塊范圍有時與功能范圍相同嗎? 我知道函數范圍適用於函數內部的所有內容,但是不知道塊范圍是什么。
是的 ,塊范圍有時與函數范圍相同。 塊范圍是一組括號內的所有內容{ a block scope here }
。 因此,在函數代碼的頂部,塊作用域將與函數作用域相同:
function test(x) {
// this is both a block scope and a function scope
let y = 5;
if (x) {
// this is a smaller block scope that is not the same as the function scope
let z = 1;
}
}
對於Javascript,目前是否建議使用let / const而不是var來進行維護? (這來自Airbnb風格指南)
let
和const
是最新的ES6規范的一部分,僅在最新的Javascript引擎中實現,有時在最新的引擎中,它們僅使用特殊標志啟用。 他們來到所有較新的JS引擎/瀏覽器,但尚未廣泛部署。 因此,如果您正在為廣泛的互聯網上的常規瀏覽器消費編寫Javascript,那么您無法可靠地使用let
和const
。
在某些情況下,您現在可以使用let
和const
安全地編程:
如果您只定位特定的Javascript引擎,並且您知道它支持這些功能(例如特定版本的nodejs或僅針對特定瀏覽器的特定版本的插件)。
如果您使用的是將代碼轉換為將在所有瀏覽器中運行的代碼的轉換程序。 使用轉換器時,您可以使用最新功能編寫代碼,並且轉換器將“啞密”,以便您的代碼可以通過使用較新功能的模擬在舊版瀏覽器中工作。
如果您正在為您知道let
和const
受支持的環境進行編程,那么建議您根據需要使用它們。 如果在函數頂部聲明一個變量,那么let
和var
將做同樣的事情。
如果在函數中聲明一個較小范圍內的變量,則let
將包含在較小的范圍內,但var
將被提升到函數的頂部,並且無論在何處聲明,都將具有函數范圍。
您鏈接的AirBnb樣式指南專門針對ES6環境編寫(請注意,其樣式指南的ES5版本有單獨的鏈接)。 所以,這意味着他們正在假設一個支持ES6的環境。 這要么是因為他們的目標是服務器端JS引擎,他們知道支持ES6,或者因為他們正在使用將ES6代碼轉換為將在ES5引擎上運行的內容的轉換程序。
關於轉運的說明。 使用transpiler和開關所有變量聲明之前let
塊范圍內,這是值得理解什么樣的代碼transpiler產生和它產生的額外的代碼是否對您的應用程序的性能有任何影響。 例如, let
塊作用域通過創建內聯IIFE來模擬,這可能導致包含let
語句的每個塊的額外運行時開銷。 我並不是說這不一定會讓你不能使用轉換器,但在決定是否使用轉換器時,我建議你徹底熟悉各種ES6的轉換代碼是什么樣的。功能讓您知道它是否適合您擁有的任何工作或僅適用於某些工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.