[Javascript] 闭包 closure

本文详细解析了JavaScript中闭包的概念及其应用场景,包括闭包如何维持变量状态、解决循环引用问题及调整this指向的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

闭包是十分的重要
校招面试的几家公司都要问到闭包的问题
最经典的是问到
闭包是什么 有什么作用
闭包循环和累加的应用
更改闭包的作用域

(1) 概念

全局下 取不到局部的变量的值

<script type="text/javascript">
    function a(){
      var name1="jessica";
      console.log(name1);
    }
    console.log(name1);
    //Uncaught ReferenceError: name1 is not defined 
</script>

闭包是一个 有权访问另一个函数作用域的变量的函数。且始终放在内存当中

<script type="text/javascript">
    function a(){
      var name="jessica";
      return function(){//匿名函数 闭包的使用
         return name;
      }
    }
    console.log(a()());
    //jessica
</script>

(2) 闭包+变量

问题:闭包只能取到任何变量的最后一个值
块级作用域
(function(){
//块级作用域
})();


(3) 闭包经典案例 - 累加

<script type="text/javascript">
   function a(){
     var i=100;
     return function(){
        i++;
        return i;
     }
   }
   var b=a();//获取函数
   console.log(b());
   console.log(b());
   console.log(b());
   console.log(b());
   console.log(b());
</script>

这里写图片描述

(4) 闭包经典案例 - 循环

问题:

<script type="text/javascript">
  function a(){
    var array=[];
    for (var i = 0; i < 5; i++) {
      array[i]=function(){
        return i;
      }
    }
    return array;
  }
  var b=a();
  for (var i = 0; i < b.length; i++) {
       console.log(b[i]());//五个5 不是01234
   //b[i]调用的是匿名函数,匿名函数并没有自我执行
   //等调用的时候, a()已经执行完毕了
  };
</script>

这里写图片描述


解决:

<script type="text/javascript">
  function a(){
    var array=[];

    for (var i = 0; i < 5; i++) {
      array[i]=(function(i){
        return i;
      })(i);//匿名函数自我执行
    }

    return array;
  }
  var b=a();
  for (var i = 0; i < b.length; i++) {
       console.log(b[i]);
  };
</script>

这里写图片描述

(4) this对象

<script type="text/javascript">
 var name="jessica";
 var obj={
    name:"krystal",
    a:function(){ 
      return function(){
        return this.name;
      }
   /*取到的值为什么是jessica?
   因为在闭包中, this指的是window
 */
    }
 }

var b=obj.a();
console.log(b());//jessica
</script>

这里写图片描述

解决:

(1) that =this

<script type="text/javascript">
 var name="jessica";
 var obj={
    name:"krystal",
    a:function(){ 
      var that=this;
      return function(){
        return that.name;
      }
    }
 }

var b=obj.a();
console.log(b());//krystal
</script>

这里写图片描述

(2) call

<script type="text/javascript">
 var name="jessica";
 var obj={
    name:"krystal",
    a:function(){ 
      return function(){
        return this.name;
      }
    }
 }

 console.log(obj.a().call(obj));
 //用obj来冒充, 改变作用域来执行a()
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值