function Person(value) {
var user = value; //这句其实可以省略
this.getUser = function () {
return user;
};
this.setUser = function (value) {
user = value;
};
}
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;
};
}
};
更完整的理解参考我的博客:对闭包的理解
定义:
就是 在外部能调用的,能够访问另一个函数作用域变量的函数 ,更简单的说,闭包就是函数,只不过是声明在其它函数内部而已。
作用:
(1)可以保留父级function中的局部变量,避免使用全局变量
(2)可以在外部调用闭包,以达到访问父级function中变量的作用(类似于面向对象编程,构造私有变量,提供对外接口等)
正因如此,可以作为对外接口使用。比如类的成员函数中访问类成员,然后外部调用类成员函数。
3个必要条件(狭义闭包):
(1)父级function内部定义子级function
(2)子级function调用父级function中的变量
(3)父级function外部调用子级function(按照mdn示例,也可以是在外部执行该子级function)
比如:
更多资料参考: https://www.cnblogs.com/TomXu/archive/2012/01/31/2330252.html
ECMAScript中,闭包指的是:
从理论角度(广义闭包):所有的函数。因为它们都在创建的时候就将上层上下文的数据保存起来了。哪怕是简单的全局变量也是如此,因为函数中访问全局变量就相当于是在访问自由变量,这个时候使用最外层的作用域。
从实践角度:以下函数才算是闭包??map也算是闭包的应用?? 1、即使创建它的上下文已经销毁,它仍然存在(比如,内部函数从父函数中返回) 2、在代码中引用了自由变量
MDN资料更清晰: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures
闭包的实际应用场景:
1、封装function定义的私有作用域
2、高阶函数,缓存数据,柯理化,事件节流防抖等等