最新的Web開發教程
 

JavaScript Closures


JavaScript變數可以屬於本地全局範圍。

私有變量可以成為可能帶密封蓋


全局變量

一個函數可以訪問函數定義的所有變量,就像這樣:

function myFunction() {
    var a = 4;
    return a * a;
}
試一試»

但功能還可以訪問函數外部定義的變量,就像這樣:

var a = 4;
function myFunction() {
    return a * a;
}
試一試»

在最後一個例子, 一個全局變量。

在網頁中,全局變量屬於窗口對象。

全局變量可以在頁面中使用(變更)所有腳本(和窗口)。

在第一個例子中, 一個是一個局部變量。

本地變量只能定義它的函數內部使用。 它是由其他功能和其他腳本代碼隱藏。

具有相同名稱的全局和局部變量是不同的變量。 修飾一個,不修改其他。

關鍵字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()有權訪問在父功能計數器變量:

function add() {
    var counter = 0;
    function plus() {counter += 1;}
    plus();   
    return counter;
}
試一試»

這可能已經解決了這個計數器的困境,如果我們可以達到plus()從外部的功能。

我們還需要找到一種方法來執行計數器= 0只有一次。

我們需要關閉。


JavaScript的閉包

記住自我調用的功能呢? 這是什麼功能呢?

var add = (function () {
    var counter = 0;
    return function () {return counter += 1;}
})();

add();
add();
add();

// the counter is now 3
試一試»

例子解釋:

添加變量被分配了一個自調用函數的返回值。

自調用函數只運行一次。 它將計數器設置為零(0),並返回一個函數表達式。

這種方式加載成為一個功能。 “妙”的是,它可以在父範圍內訪問計數器。

這被稱為一個JavaScript 閉合,這使得有可能為一個函數具有“ 私有 ”的變量。

計數器是由匿名功能的範圍的保護,並且只能使用添加功能來改變。

閉包是父範圍有功能的訪問,家長功能關閉後。