Javascript 中的閉包其實很改語言中很難理解的一部分。感謝 Stuart 提供了那麼棒的 PPT,它深入淺出的解釋了 Javascript 的閉包技術。
而我“自作主張”地在這份 PPT 中加入了部分的註釋(希望沒有影響閱讀),主要的內容在這裏簡要整理下。
閉包的概念
“官方”的解釋
“閉包”,是指擁有多個變量和綁定了這些變量的環境的
表達式(通常是一個函數),因而這些變量也是該表達式
的一部分。
但不要咬文嚼字,我們簡單的可以理解爲
閉包是個函數,而它“記住了周圍發生了什麼”。表現爲由“一個函數”體中定義了“另個函數”
- function outer () {
- ...
- function inner () {
- ...
- }
- }
閉包的作用
- setTimeout/setInterval
- 回調函數(callback)
- 事件句柄(event handle)
模塊化代碼
- function Container(param) {
- var sercert = 3;
- this.member = param;
- var that = this; // 注意這行
- function dec() {
- return (sercert > 0) ? --secret : false;
- }
- this.service = function() {
- return (dec()) ? that.member : null;
- }
- }
其中 dec 爲私有,that 變量引用 Container 同時 service 函數構成了個閉包。
注意 Exploer 下閉包的“特殊情況”
- 循環問題
- 垃圾回收
最後,PPT 可以在這裏下載,同時需要進一步有關閉包的信息,爲之漫筆翻譯了份很詳實的文檔,強烈建議看下。