闭包:函数执行,形成私有的执行上下文,使内部私有变量不受外界干扰,起到保护和保存的作用。
作用:①保护:避免命名冲突;②保存:解决循环绑定引发的索引问题;③变量不会销毁:可以使用函数内部的变量,使变量不会被垃圾回收机制回收。
应用:设计模式中的单例模式;for循环中的保留i的操作;防抖和节流;函数柯里化。
缺点:内存泄漏
闭包的3个特性:
- 函数嵌套函数
- 函数内部可以引用函数外部的参数和变量
- 参数和变量不会被垃圾回收机制回收
//1.函数作为返回值
function test(){
const name = "haoran";
return function(){
return name;
}
}
const fn = test()
console.log(fn()) //haoran
//2.函数作为参数
function test(fn){
const a = 1;
fn();
}
const a = 2;
function fn(){
console.log('a',a)
}
test(fn) //a 2
//3.定时器与闭包
/* i++ 与 ++i的主要区别:
01.i++返回原来的值,++i返回加1后的值
02.i++不能作为左值,而++i可以 */
for (var i = 0; i < 5; ++i) {
setTimeout(function() {
console.log(i + '');
}, 1000);
}
//⑤5
for(var i = 0; i < 5; ++i){
(function(i){
setTimeout(function() {
console.log(i + ' ');
}, 1000);
}(i))
} //0 1 2 3 4 5
//②闭包作为参数传递
var num = 15
var fn1 = function(x){
if(x>num){
console.log(x);
}
}
void function(fn2){
var num = 100
fn2(30)
}(fn1) //30总结:
❤好处:
1.保护函数内的变量安全,实现封装,防止变量流入其他环境发生命名冲突。
2.在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存)
3.匿名自执行函数可以减少内存消耗
❤坏处:
1.被引用的私有变量不能被销毁,增加了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值null
2.由于闭包涉及跨域访问,所以会导致性能损失,可通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响
❤内存、垃圾回收机制
内存泄漏:不再使用的内存没有被及时释放出来,导致该段内存无法被使用。
为什么会导致内存泄漏:内存泄漏指我们无法在通过js访问某个对象,而垃圾回收机制却认为该对象还在被引用,因此垃圾回收机制不会释放该对象,
导致该内存永远无法释放,积少成多,系统会越来越卡以至于崩溃
❤垃圾回收机制都有哪些策略?
标记清除法、引用计数法
❤防抖和节流
防抖:n秒后在执行该事件,若在n秒内被重复触发,则重新计时
节流:n秒内只运行一次,若在n秒内被重复触发,只有一次生效
版权声明:本文为weixin_48912846原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。