js闭包

一,闭包是什么
闭包是:函数内部和函数外部连接的桥梁;可以读取其他函数内变量的函数;
可以访问外部函数的变量,并将这些变量保存在内存中,供内部函数在外部函数执行完毕后继续使用;
常被用于工厂函数、模块化等场景。

二,闭包优缺
优点:①保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突; ②在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存);③匿名自执行函数可以减少内存消耗 
缺点:①其中一点上面已经有体现了,就是被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null; ②其次由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响 

三,闭包示例

1.函数赋值
function aFunction(){
  let aName = 'hello';
  function bFunction(){
     //处理数据
     console.log(aName)      
  }         
  return bFunction;  
}
var c = aFunction()
c(); // 输出:hello
在这个例子中,aFunction是外部函数,它声明了一个变量aName。内部函数bFunction可以访问外部函数的aName变量,并在执行时输出该变量的值。
aFunction执行后返回了bFunction,此时bFunction仍然可以访问到aName。这就是一个简单的闭包示例。
2.返回值
function aFunction(){
var name = 'hello'
return function (){return name}
}
aFunction();//
输出:hello
3.循环赋值(定时器与闭包)
let块级作用域,每次迭代都会声明
用var声明i的话,会输出了五次5,由于js是单线程的,所以在执行for循环的时候定时器setTimeout被安排到任务队列中排队等待执行,
而在等待过程中for循环就已经在执行,等到setTimeout可以执行的时候,for循环已经结束,i的值也已经编程5,所以打印出来五个5
for(let i= 1;i<10;i++){
setTimeout(
function(){//打印i}
,1000);
}

 

posted @ 2023-08-24 17:23  Ali枝  阅读(40)  评论(0编辑  收藏  举报