js闭包简单理解

102 阅读2分钟

闭包的定义:

闭包是指有权访问另一个函数作用域中变量的函数。创建闭包的最常见的方式就是在一个函数A内创建另一个函数B,通过函数B访问函数A的局部变量。

闭包优缺点:

闭包的作用(优点):

1)读取另一个函数作用域中的变量;

2)让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。

3)封装对象的私有属性和私有方法。(然后在全局作用域中通过调用闭包就能访问函数中的变量)

闭包的缺点:

1) 常驻内存,增加内存使用量。

2.) 使用不当会很容易造成内存泄露。

闭包的特点:

  1. 作为一个函数变量的一个引用,当函数返回时,其处于激活状态。
  2. 一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
        function f1() {
            var n = 100;
            return function f2() {
                alert(++n);
            }
        }
函数执行时创建了一个内部函数,这个内部函数作为返回值,或以某种方式保留下来(属性),之后才会调用,这就会形成了闭包。通俗来讲,JS所有的function都是一个闭包。
闭包的应用
1、匿名自执行函数

我们创建了一个匿名的函数,并立即执行它,由于外部无法引用它内部的变量,因此在函数执行完后会立刻释放资源,关键是不污染全局对象。


 (function () {
            var days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
                today = new Date(),
                msg = 'Today is ' + days[today.getDay()] + ', ' + today.getDate();
            alert(msg);
        }());

2、封装
    var person = function () {
        //变量作用域为函数内部,外部无法访问
        var name = "default";
        return {
            getName: function () {
                return name;
            },
            setName: function (newName) {
                name = newName;
            }
        }
    }();
3、实现类与继承

        var p = new Person();
        p.setName("Tom");
        alert(p.getName());//Tom

        var Jack = function () { };
        //继承自Person
        Jack.prototype = new Person();
        //添加私有方法
        Jack.prototype.Say = function () {
            alert("Hello,my name is Mack");
        };
        var j = new Mack();
        j.setName("Mack");
        j.Say();
        alert(j.getName());//Mack