女朋友"胖子"正在學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 閉包會在父函式外部,改變父函式內部變數的值。所以,如果你把父函式...