標籤: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閉包