闭包的定义:
闭包是指有权访问另一个函数作用域中变量的函数。创建闭包的最常见的方式就是在一个函数A内创建另一个函数B,通过函数B访问函数A的局部变量。
闭包优缺点:
闭包的作用(优点):
1)读取另一个函数作用域中的变量;
2)让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。
3)封装对象的私有属性和私有方法。(然后在全局作用域中通过调用闭包就能访问函数中的变量)
闭包的缺点:
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