ymcdhr / js-points

js知识点
3 stars 3 forks source link

js基础—Javascript关于闭包 #6

Open ymcdhr opened 7 years ago

ymcdhr commented 7 years ago

更完整的理解参考我的博客:对闭包的理解

定义:
就是 在外部能调用的,能够访问另一个函数作用域变量的函数 ,更简单的说,闭包就是函数,只不过是声明在其它函数内部而已。

作用:
(1)可以保留父级function中的局部变量,避免使用全局变量
(2)可以在外部调用闭包,以达到访问父级function中变量的作用(类似于面向对象编程,构造私有变量,提供对外接口等)
正因如此,可以作为对外接口使用。比如类的成员函数中访问类成员,然后外部调用类成员函数。

function Person(value) {
    var user = value;                 //这句其实可以省略
    this.getUser = function () {
        return user;
    };
    this.setUser = function (value) {
        user = value;
    };
}

3个必要条件(狭义闭包):
(1)父级function内部定义子级function
(2)子级function调用父级function中的变量
(3)父级function外部调用子级function(按照mdn示例,也可以是在外部执行该子级function)

比如:

var user = 'The Window';

var obj = {
    user : 'The Object',
    getUserFunction : function () {
        return function () {//这应该不是闭包,因为没有调用父级变量//function不属于obj,里面的this指向window
            return this.user;
        };
    }
};

alert(obj.getUserFunction()());//The window

//可以强制指向某个对象
alert(obj.getUserFunction().call(obj));//The Object

//也可以从上一个作用域中得到对象
var obj = {
    user : 'The Object',
    getUserFunction : function () {
        var that = this;//从对象的方法里得对象
        return function () {
            return that.user;
        };
    }
};

MDN资料更清晰: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures