深刻浅出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

使用闭包封装函数,便于使用私有变量。

闭包的好坏

  • 好处:灵活方便,封装
  • 坏处:空间浪费,内存泄漏(循环引用),性能消耗
相关文章
相关标签/搜索