前端必知:JavaScript中的闭包

JS中的闭包

闭包的一般理解为:定义在函数内部的函数。外部函数返回的是内部函数。

我们可以把闭包简单理解成“定义在一个函数内部的函数”,当然,也可以是多个函数内部的函数,一定是函数嵌套,定义在函数内部的函数。外部函数返回的是内部函数。
  闭包有两个作用,一是将内部函数作为返回值,可以让外部函数调用。二是这些返回值始终保存在内存中,影响内存。

例1:
function parent(){
  var a=123;
    function son(){
        console.log(a);
    }
    //将son函数作为返回值返回给外部
    return son;
 }
 //声明一个变量,保存parent函数
 var test=parent();
 //执行函数
 test()//123
例2:
//作为函数累加器,这个题目中经常会遇到
function add(){
    var num=0;
    function son(){
        console.log(++num);
    }
    return son;
}
var myadd=add();
myadd();//1
myadd();//2
myadd();//3
例3:
function test(){
	 var food="apple";
	  //声明一个变量(对象),并给它赋予两个函数
	  var obj={
	      //eat函数
	      eat:function(){
	          if(food!=""){
	              console.log("I am eating "+food)
	              food=""
	          }
	          else{
	              console.log("Nothing")
	          }
	      },
	      //push函数,参数为myfood
	      push:function(myfood){
	          food+=" "+myfood;
	      }
	  }          
	  return obj;
}
//调用方法
 var mytest=test();
 mytest.eat();// 等同test().eat();结果:I am eating apple
 mytest.eat();//nothing
 mytest.push("banana");
 mytest.eat();//I am eating banana
例4:

function test(){
    var arr=[];
    for (var i = 0; i < 10; i++) {
            arr[i]=function(){
            console.log(i);
        }
    }
    return arr;
}
var myarr=test();
for(var j=0;j<10;j++)
{
    myarr[j]();//调用数组中元素的function方法, console.log(i);
}//结果是10个10,因为执行时i已经等于10
例5:典型例题,笔试选择题经常有。
<ul>
         <li>1</li>
         <li>2</li>
         <li>3</li>
         <li>4</li>
 </ul>
 function test1(){
        var lis=document.getElementsByTagName("li");
        for(var i=0;i<lis.length;i++)
        {
            lis[i].onclick=function(){
                console.log(i);
            }

        }
    }
    test1();//点击结果全是4,闭包,运行onclick时i已经是4
   function test2(){
        var lis=document.getElementsByTagName("li");
        for(var i=0;i<lis.length;i++)
        {
            //立即执行函数
            (function(j){lis[j].onclick=function(){               
                console.log(j);
            }
            }(i))
        }
    }
    test2();//点击结果分别是:0,1,2,3
例6:大厂面试题
//例题
    a=100;
    function demo(e){
        function e(){}
        arguments[0]=2;//与e是映射关系,第一个实参等于2
        console.log(e);//2
        if(a){
            var b=123;
        }
        var c;
        a=10;
        var a;
        console.log(b);//undefined
        f=123;
        console.log(c);//undefined
        console.log(a);//10
    }
    var a;
    demo(1);//执行结果在函数后写有注释
    console.log(a);//100
    console.log(f);//123

闭包以及几个典型例子,总结分享。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清颖~

您的鼓励让我们一起进步,加油!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值