什么是闭包?
function outerFun(){
let a = 10;
function innerFun(){
console.log(a);
}
return innerFun()
}
let fun = outerFun()
fun()
// 10
- 闭包:函数执行时创建了一个内部函数,这个内部函数作为返回值,或以某种方式保留下来(属性),之后才会调用,这就会形成了闭包。通俗来讲,JS所有的function都是一个闭包;正常情况下,函数执行完毕,内部变量会销毁。
- 特点:内部函数没有执行完成,外部函数的变量不会被垃圾回收
- 用途
- 用来封装代码,实现模块化,减少全局变量的声明
let module = (function () {
let a = 1;
let b = 2;
function add() {
return a + b
}
function sub() {
return b - a
}
return { add, sub }
})()
- 实现类和继承
function Person() {
var name = "default";
return {
getName: function () {
return name;
},
setName: function (newName) {
name = newName;
}
}
};
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 Jack");
};
var j = new Jack();
j.setName("Jack");
j.Say();
alert(j.getName());//Jack
- 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
- 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值
网友评论