JavaScript變數可以屬於本地或全局範圍。
私有變量可以成為可能帶密封蓋 。
全局變量
一個函數可以訪問函數中定義的所有變量,就像這樣:
但功能還可以訪問函數外部定義的變量,就像這樣:
在最後一個例子, 一個是全局變量。
在網頁中,全局變量屬於窗口對象。
全局變量可以在頁面中使用(變更)所有腳本(和窗口)。
在第一個例子中, 一個是一個局部變量。
本地變量只能定義它的函數內部使用。 它是由其他功能和其他腳本代碼隱藏。
具有相同名稱的全局和局部變量是不同的變量。 修飾一個,不修改其他。
無關鍵字var創建的變量,始終是全球性的,即使他們是一個函數內部創建的。
可變生命
只要全局變量住您的應用程序(你的窗口/網頁)生活。
局部變量有短暫的一生。 在調用功能時它們被創建,並且當函數結束刪除。
A計數器困境
假設你想使用一個變量計數的東西,並且希望此計數器可用於所有的功能。
你可以使用全局變量和函數來增加計數器:
例
var counter = 0;
function add() {
counter += 1;
}
add();
add();
add();
// the counter is now equal to 3
試一試» 計數器應僅由改變add()函數。
問題是,頁面上的任何腳本可以改變計數器,不調用add() 。
如果我宣布在函數內部計數器,任何人都無法改變它不調用Add()方法:
例
function add() {
var counter = 0;
counter += 1;
}
add();
add();
add();
// the counter should now be 3, but it does not work !
試一試» 它不起作用! 我每次調用add()函數,計數器設置為1。
一個JavaScript內部函數可以解決這個問題。
JavaScript的嵌套函數
所有功能都可以訪問全局範圍。
事實上,在JavaScript中,所有功能可使用“上方”它們的範圍。
JavaScript的支持嵌套函數。 嵌套函數可以訪問“上面”他們的範圍。
在本實施例中,內功能plus()有權訪問在父功能計數器變量:
這可能已經解決了這個計數器的困境,如果我們可以達到plus()從外部的功能。
我們還需要找到一種方法來執行計數器= 0只有一次。
我們需要關閉。
JavaScript的閉包
記住自我調用的功能呢? 這是什麼功能呢?
例
var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
add();
add();
add();
// the counter is now 3
試一試» 例子解釋:
添加變量被分配了一個自調用函數的返回值。
自調用函數只運行一次。 它將計數器設置為零(0),並返回一個函數表達式。
這種方式加載成為一個功能。 “妙”的是,它可以在父範圍內訪問計數器。
這被稱為一個JavaScript 閉合,這使得有可能為一個函數具有“ 私有 ”的變量。
計數器是由匿名功能的範圍的保護,並且只能使用添加功能來改變。
閉包是父範圍有功能的訪問,家長功能關閉後。