2015-06-08 199 views
5
  1. 塊範圍有時功能範圍一樣嗎?我知道函數範圍適用於函數內的所有內容,但並不知道塊範圍是什麼。
  2. 對於Javascript,是否當前建議使用let/const而不是var以備將來維護? (這是從Airbnb Style Guide

回答

2

我不知道你真的得到了回答您的問題尚未:

是塊作用域有時一樣的功能範圍有多大?我知道函數作用域是函數內部的所有東西,但是並不完全取決於塊作用域。

,塊作用域有時與函數作用域相同。塊範圍是一組大括號內的所有內容{ 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,是目前推薦使用讓/常量無功而不是 爲將來的維護? (這是從製作的Airbnb風格指南)

letconst是最新ES6規範的一部分,僅在最新的JavaScript引擎來實現,有時甚至在最新的引擎,他們僅與特殊標誌啓用。他們來到所有新的JS引擎/瀏覽器,但尚未廣泛部署。因此,如果您在廣泛的互聯網上爲常規瀏覽器消費編寫Javascript,則您還無法可靠地使用letconst

有些情況下,你可以安全地letconst程序現在:

  1. 如果你的目標只是一個特定的Javascript引擎,你知道它具有這些特徵(如特定的支持版本的nodejs或僅用於特定瀏覽器的特定版本的插件)。

  2. 如果您使用的是將您的代碼轉換爲可在所有瀏覽器中運行的代碼的轉譯程序。使用轉譯器時,可以使用最新功能編寫代碼,並且轉譯器將「貶低它」,以便通過使用新功能的模擬,在舊版瀏覽器中運行代碼。

如果你是編程的,你知道,letconst被支持的環境,那麼最好使用它們適當。如果你在函數的頂部聲明瞭一個變量,那麼letvar將做同樣的事情。

如果聲明在函數內的一個小範圍的變量,然後let將被包含在較小的範圍之內,但var將被提升到函數的頂部,將有功能範圍,無論在聲明。


AirBnb Style Guide您鏈接到專門爲ES6環境編寫的(注意有一個單獨的鏈接,他們的風格指南的ES5版)。所以,這意味着他們正在採用ES6環境。這要麼是因爲他們針對的是服務器端JS引擎,他們知道它支持ES6,或者是因爲他們使用的是將ES6代碼轉換爲可在ES5引擎上運行的代碼的轉換器。


關於transpilers的筆記。在使用塊轉換器並在塊範圍內將所有變量聲明切換到let之前,值得理解轉換程序生成的代碼類型以及它生成的額外代碼是否對應用程序的性能有任何影響。例如,通過創建內聯IIFE來模擬let的塊範圍,這可能導致每個包含let語句的塊的額外運行時間開銷。我並不是說這肯定是一件壞事,應該讓你不要使用轉譯器,但是在決定是否使用轉譯器時,我建議你徹底熟悉一下各種ES6的轉譯代碼的樣子功能,因此您知道它是否適合您的任何工作或僅用於某些工作。

7
  1. 的JavaScript 5不使用它使用鏈式範圍阻塞範圍。主要區別在於,除非將其設置爲全局,否則無法訪問範圍外的變量。當你用let聲明一個變量時,ES 6將會阻塞範圍。
  2. 目前推薦使用var,因爲ES 6不完全受支持。
+0

是否有預計發佈ES6的日期?我想知道爲什麼Airbnb會推薦我們儘早使用ES6標準。 – chenghuayang

+1

@程華陽:ES6 *規範*已經有幾年的發佈日期了,我認爲有一段時間它應該在2012年或2013年完成。最後我聽說,是的,他們期待它成爲今年。但是當然,你必須等待供應商支持它,並讓人們升級他們的瀏覽器。至於Airbnb,好吧,也許他們正在轉型,或者他們只是在推動議程。 –

+1

@ ChenghuaYang Airbnb團隊已經在ES6中編寫代碼,但他們使用了代碼轉換器(如[Traceur](https://github.com/google/traceur-compiler)或[Babel](http://babeljs.io/))將其轉換爲ES5,以便他們的代碼可以在當今的瀏覽器中使用。 – laruiss

3

塊範圍有時與功能範圍相同嗎?我知道函數範圍適用於函數內的所有內容,但並不知道塊範圍。

塊作用域是一切都在一側的,例如:

function foo() { 
    // function scope 
    if (condition) { 
     // block scope 
    } 
} 

向上穿過第5版規範,JavaScript的沒有塊範圍。接近完成的下一個規範(ECMAScript 6,又名「ES6」)通過letconst增加了塊範圍。

對於Javascript,目前是否推薦使用let/const代替var以備將來維護?

這完全取決於你。 letconst是您可以添加到腰帶的新工具。如果你不想要他們,他們不會取代var。這就是說,你聽到很多「let是新的var」。

let聲明的變量有塊範圍,用var聲明的變量沒有。

請注意,letconstdon't have great support in the wild yet。沒有太大的驚喜,爲一個以前從未有過的引擎添加塊範圍可能是不重要的。你可以使用像Babel這樣的譯員,或者現在就使用var