深入浅出Javascript:面向对象之闭包

理解闭包

概念

闭包是指 有权访问另一个函数作用域中的变量的 函数。

函数式闭包(在内部保存数据和对外部无副作用)

创建方法

在一个函数内部创建另一个函数(闭包)

原理

普通函数:在outer()执行完,局部变量local被销毁,内存仅仅保存全局作用域。

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

闭包:在outer()执行后,func()仍然可以访问outer()内部的localVal,因为func()将outer()的内的活动对象(localVal)添加到了func()的作用域链。在outer()执行后,由于localVal被func()的作用域链所引用,所以localVal不会被销毁,而是存在内存中,直到func()被销毁,才会随之销毁。

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);
        }
    });
}();

错误的使用

循环

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

闭包的好坏

  • 好处:灵活方便,封装
  • 坏处:空间浪费,内存泄漏(循环引用),性能消耗
    原文作者:幸运儿
    原文地址: https://segmentfault.com/a/1190000005013790
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞