談論javascript閉包

來源:互聯網
上載者:User

標籤:make   組合   環境   返回   das   div   body   傳遞   閉包   

閉包看似很簡單,其實牽扯了很多東西,例如:上下文範圍、記憶體佔用、局部以及全域變數等

 

function init() {    var name = "Mozilla"; // name 是一個被 init 建立的局部變數    function displayName() { // displayName() 是內建函式,一個閉包        alert(name); // 使用了父函數中聲明的變數    }    displayName();}init();

 

init是外部函數,name是外部變數。

displayName屬於內建函式調用時使用的是父函數(init())的聲明的變數。

嵌套的函數可以訪問在其外部聲明的變數,簡而言之就是內建函式可以訪問外部函數。

 

下面的例子也解釋了範圍對變數的影響,請看如下:

function init() {    var name = "Mozilla"; // name 是一個被 init 建立的局部變數    function displayName() { // displayName() 是內建函式,一個閉包        var name = "6666";        alert(name); // 使用了父函數中聲明的變數    }    displayName();}init();

上下文範圍,同名變數局部範圍最大。

 

 

function makeFunc() {    var name = "Mozilla";    function displayName() {        alert(name);    }    return displayName;}var myFunc = makeFunc();myFunc();

JavaScript中的函數會形成閉包。 閉包是由函數以及建立該函數的詞法環境組合而成。這個環境包含了這個閉包建立時所能訪問的所有局部變數。在我們的例子中,

myFunc 是執行 makeFunc 時建立的 displayName 函數執行個體的引用,而 displayName 執行個體仍可訪問其詞法範圍中的變數,即可以訪問到 name 。

由此,當 myFunc 被調用時,name 仍可被訪問,其值 Mozilla 就被傳遞到alert中。

 

function makeAdder(x) {    return function(y) {        console.log(‘:‘ + x);        return x + y;    };}var add5 = makeAdder(5);var add10 = makeAdder(10);console.log(add5(2)); // 7console.log(add10(2)); // 12

在這個樣本中,我們定義了 makeAdder(x) 函數,他接受一個參數 x ,並返回一個新的函數。返回的函數接受一個參數 y,並返回x+y的值。

從本質上講,makeAdder 是一個函數工廠 — 他建立了將指定的值和它的參數相加求和的函數。在上面的樣本中,我們使用函數工廠建立了兩個新函數 — 一個將其參數和 5 求和,另一個和 10 求和。

add5 和 add10 都是閉包。它們共用相同的函數定義,但是儲存了不同的詞法環境。在 add5的環境中,x 為 5。而在 add10 中,x 則為 10。

 

未完待續。。。

談論javascript閉包

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.