闭包
今天在刷题的时候,看到了一个关于js闭包的问题,然后发现自己好像也是一知半解,后来面向百度了查了一下。
闭包是啥?
简单的来说就是我可以在一个函数里面用到它作用域之外的变量,那么这个变量和这个函数之间的环境就叫做闭包
举个简单的栗子
var text = "外部变量";
function foo(){
console.log(text);
}
foo();//外部变量
上面这个就是一个简单的闭包 变量text是函数foo作用域之外的变量,我在foo函数里面调用了text.这个就是闭包
闭包的作用:
用的比较多的:
1.读取函数内部变量。
在一些情况下,我们不太适合定义一个全局变量,所以我们得定义一个局部变量比较安全,但是局部变量别人怎么用呢
这个时候得用闭包,举个栗子,假设我现在手头有笔现金巨款,放在家里总归是不太安全的,这个时候我想到了啥,放银行存起来,
我存过之后,该怎么用呢,用银行卡来使用操作这笔钱。钱=变量,银行=函数,银行卡=闭包,我=使用者。
function foo(){
var money = 200;
function bar(){
return money;
}
return bar();
}
var func = foo();
console.log(func());//200
2.变量始终保存在内存中,不会被垃圾回收机制回收(这个等我后面在说)
function foo(){
var money = 200;
moneyAdd = function(){
money +=10;
}
function bar(){
return money;
}
return bar();
}
var func = foo();
console.log(func());//200
moneyAdd(); //调用方法存钱方法
console.log(func());//210
在这段代码中,func实际上就是闭包bar函数。它一共运行了两次,第一次的值是200,第二次的值是210。这证明了,函数foo中的局部变量money一直保存在内存中,并没有在foo调用后被自动清除。 为什么会这样呢?原因就在于foo是bar的父函数,而bar被赋给了一个全局变量,这导致bar始终在内存中,而bar的存在依赖于foo,因此foo也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
使用闭包时的注意点:
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
结语
以上就是我参照网上的资料,加上自己的一些理解,后面也会及时补充其他的知识点。如果有什么问题,麻烦指点一下,我也会及时纠正的,谢谢