深刻淺出Javascript:面向對象之閉包

理解閉包

概念

閉包是指 有權訪問另外一個函數做用域中的變量的 函數。ajax

函數式閉包(在內部保存數據和對外部無反作用)閉包

建立方法

在一個函數內部建立另外一個函數(閉包)函數

原理

普通函數:在outer()執行完,局部變量local被銷燬,內存僅僅保存全局做用域。性能

function outer() {
    var localVal = 30;
    return localVal;
}
outer(); // 30

閉包:在outer()執行後,func()仍然能夠訪問outer()內部的localVal,由於func()將outer()的內的活動對象(localVal)添加到了func()的做用域鏈。在outer()執行後,因爲localVal被func()的做用域鏈所引用,因此localVal不會被銷燬,而是存在內存中,直到func()被銷燬,纔會隨之銷燬。url

function outer() {
    var localVal = 30;
    return function() {
        return localVal;
    }
}
var func = outer();
func(); // 30

閉包的應用

  • 監聽事件
!function() {
    var localData = "localData here";
    document.addEventListener('click',
        function() {
            console.log(localData);
        }
    );
}();
  • ajax事件
!function() {
    var localData = "localData here";
    var url = "http://www.baidu.com/";
    $.ajax({
        url: url;
        success: function() {
            console.log(localData);
        }
    });
}();

錯誤的使用

循環code

使用閉包封裝函數,便於使用私有變量。

閉包的好壞

  • 好處:靈活方便,封裝
  • 壞處:空間浪費,內存泄漏(循環引用),性能消耗
相關文章
相關標籤/搜索