javascript中變量的範圍是什麼? 它們在函數內部和外部的做用域是否相同? 仍是有關係嗎? 另外,若是變量是全局定義的,這些變量將存儲在哪裏? javascript
據我瞭解,關鍵是Javascript具備功能級別範圍,而不是更常見的C塊範圍。 html
這是一篇關於該主題的好文章。 java
我發現許多不熟悉JavaScript的人都難以理解,繼承默認狀況下是該語言可用的,而且函數做用域是迄今爲止惟一的做用域。 我提供了我去年年末寫的名爲JSPretty的美化工具的擴展。 要素顏色在代碼中做用域,而且始終將顏色與該做用域中聲明的全部變量關聯。 當一個顏色的變量來自一個範圍時,在另外一個範圍中使用可視化的方式顯示了閉包。 git
請嘗試如下功能: github
觀看演示: chrome
在如下位置查看代碼: 安全
當前,該功能支持深度16個嵌套函數,但當前不爲全局變量着色。 閉包
試試這個奇怪的例子。 在下面的示例中,若是a是一個初始化爲0的數字,則將看到0,而後是1。除了a是一個對象,而且javascript會將f的指針(而不是其副本)傳遞給f1。 結果是您兩次都收到相同的警報。 jsp
var a = new Date(); function f1(b) { b.setDate(b.getDate()+1); alert(b.getDate()); } f1(a); alert(a.getDate());
1)有一個全局範圍,一個功能範圍以及with和catch範圍。 一般,變量沒有「塊」級做用域-with和catch語句將名稱添加到其塊中。 函數
2)做用域一直由函數嵌套到全局做用域。
3)經過原型鏈解決屬性。 with語句將對象屬性名稱帶到with塊定義的詞法範圍內。
編輯:ECMAAScript 6(Harmony)被指定爲支持let,我知道chrome容許使用「 harmony」標誌,所以也許它確實支持它。
讓咱們爲塊級做用域提供支持,可是您必須使用關鍵字來實現它。
編輯:基於本傑明在評論中指出with和catch語句,我已經編輯了帖子,並添加了更多內容。 with和catch語句都將變量引入其各自的塊中,這就是塊做用域。 這些變量是傳遞給它們的對象的屬性的別名。
//chrome (v8) var a = { 'test1':'test1val' } test1 // error not defined with (a) { var test1 = 'replaced' } test1 // undefined a // a.test1 = 'replaced'
編輯:澄清示例:
test1的做用域爲with塊,但別名爲a.test1。 「 Var test1」在上層詞法上下文(函數或全局)中建立一個新變量test1,除非它是-的屬性。
kes! 當心使用'with'-就像var是noop,若是變量已經在函數中定義,就從對象導入的名稱而言,它也是noop! 對已經定義的名稱稍加註意將使此操做更加安全。 所以,我我的將永遠不會使用。
全局變量就像全局明星同樣(成龍,納爾遜·曼德拉)。 您能夠從應用程序的任何部分訪問它們(獲取或設置值)。 全局功能就像全局事件(新年,聖誕節)。 您能夠從應用程序的任何部分執行(調用)它們。
//global variable var a = 2; //global function function b(){ console.log(a); //access global variable }
若是您在美國,可能會認識臭名昭著的名人金·卡戴珊(Kim Kardashian)(她設法制做了小報)。 可是美國之外的人不會認出她。 她是當地的明星,必定會進入她的領土。
局部變量就像局部恆星。 您只能在範圍內訪問它們(獲取或設置值)。 局部函數就像局部事件-您只能在該範圍內執行(慶祝)。 若是要從範圍以外訪問它們,則會獲得參考錯誤
function b(){ var d = 21; //local variable console.log(d); function dog(){ console.log(a); } dog(); //execute local function } console.log(d); //ReferenceError: dddddd is not defined