寫給女友的JS教程 之JS閉包

2021-06-16 14:16:57 字數 2069 閱讀 9675

女朋友"胖子"正在學js, 到閉包這一塊遇到了一些障礙.

我在網上幫她找了一些文章,但又寫的又枯燥又長,我來寫一篇簡單點的吧.

從一次穿越說起-----

有姐妹倆,大桃花和小桃花相繼出生,

有一次小桃花在河邊洗衣服,出現奇特星像--十字連珠,小桃花穿越到了清朝.

還進宮見到了四阿哥,身邊有一群宮女,和小桃花妹相稱.

四阿哥問:"小桃花,你的姐姐是誰?"

小桃花怎麼答?   這牽涉到乙個問題----

人穿越後,對其親人的計算,以"出生"時的環境為準,還是"當前問她"時的環境為準?

如果你回答:"以當前問她是為準",那你是"賣姐求榮"啊.

如果你回答:"以她出生時為準,即回答大桃花" ----,恭喜你,你已理解了閉包.

閉包即 函式定義時,連同其定義環境的上下文,形成乙個整體.

不管該函式在哪兒執行,其對變數的訪問,都要從定義處開始尋找.

例子1: 看你理解了沒

function closure() 

return mysister; // 這個函式出生時,有乙個sister 叫大桃花

}function place()

place(); // 清宮戲開始;

// 列印"大福晉",還是列印"大桃花"?

// 對的,"大桃花",閉包就這麼簡單,你已經悟了.

例子二: 再複雜一點,來個閉包計數器

如果你準備在頁面內建乙個"統一id號生成器",

比如為各種事件控制代碼,或者事件呼叫統一分配不重複的id,

(jquery裡就有類似的應用).

---如何來做呢?

你可能說:"好辦,弄個全域性變數,叫count, 每次都把+1", 

全域性變數可以做到,但是這種做法不夠優雅,造成全域性變數汙染.

更壞的是這個變數,容易被別人(不小心)定義的同名全域性變數給覆蓋了.

怎麼辦? 用閉包!

// 閉包計數器

var counter = (function() ); // 返回乙個匿名函式

})(); //立即執行匿名函式,返回值是乙個函式,該函式賦給counter

alert(counter()); // 1

alert(counter()); // 2

alert(counter()); // 3

在上面的例子中, 

1:除了counter()函式,其他語句對於cnt都夠不著,摸不到.

2: 匿名函式執行後,給人的感覺是----函式內的區域性變數 cnt應該消失才對,

實際上沒有消失----被返回的函式所捕捉,形成了乙個"環境變數+函式"的包,

外界又打不進去, 所以叫閉包啊.

例子三: 如何在js的物件導向應用中,寫乙個私有屬性?

你已經猜到了,還是用閉包.

// 閉包示愛器---js物件導向之私有屬性問題

function girl()

}var lindaiyu = new girl();

// 想一想,在外界,誰能訪問到黛玉的"age"?

// 大家都可以

alert(lindaiyu.age); // 19;

// 再想,誰能在外界訪問到黛玉的"love"

// 誰也別想,除非黛玉的showlove()公有方法才能訪問該值

alert(lindaiyu.showlove());

例子四: 看你確實掌握了閉包沒?

// 我想建立4個函式,裝在乙個陣列裡

// 每個函式呼叫時,彈出不同的值

// 於是我寫出這樣的for迴圈

for(var i=0,arr=;i<=3;i++) );

}arr[0](); // ?? 結果不是0

arr[1](); // ?? 全是4

// 你能把其中的錯誤改正過來嗎? :)

要去趕城鐵,就寫到這兒吧. 

閉包很簡單,,只是大家給形容難了....

說說js閉包

js閉包涉及到作用域,js的作用域有兩種,全域性變數和區域性變數,全家變數就是在函式外宣告的,區域性變數是在函式內宣告的,函式內部可以直接讀取全域性變數 但是函式外部自然無法讀取函式內的區域性變數 函式內部宣告變數的時候,要用var不然就是個全域性變數 有時候需要得到函式內的區域性變數 濫用閉包會可...

JS閉包理解

下圖例項 body ul li 1 li li 2 li li 3 li ul body html script vara document.getelementsbytagname li for vari 0 i a.length i i 如何從外部讀取區域性變數 functionvisitinn...

JS基礎 閉包

注 自由變數是既不是在本地宣告又不作為引數傳遞的一類變數。function a return b var b a b hello closure 定義乙個函式a a中定義了函式b a中返回b 執行a 把a的返回結果賦值給變數b 執行b 閉包會在父函式外部,改變父函式內部變數的值。所以,如果你把父函式...