ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

JavaScript闭包题

2022-01-21 10:03:22  阅读:219  来源: 互联网

标签:闭包 fun1 变量 JavaScript var fun 闭包题 函数


闭包

该函数通常为内部函数,被返回,外部可以引用该函数,通过其访问自由变量。

(自由变量指不是函数参数,也不是函数内部变量的变量,即外部变量)

闭包的形成将一个内部函数,通过某种方式保存到外部,使其引用的作用域链不会被释放,导致外部可以使用内部的变量。

例如:

如果想使用函数a内部的变量,我们就可以在函数a内部再定义一个函数b,并把它返回出去;

function a(){
    var aaa = 123;
    var bbb =456;
    function b(){
        console.log(aaa);
    }
    return b;
}


var demo=a()
demo()//可以输出aaa变量

上一篇说到,函数b的作用域链是有a函数的AO,可以使用a函数内部的变量,所以将b函数返回到a外部后,a函数的AO是一直被引用的,所以在外部也可以通过b函数,把b当做介质可以访问到a函数内部的变量;

所以闭包的用途

1.读取函数内部的变量

2.让变量的值始终保持在内存中,比如循环注册事件,在事件中访问循环变量,需要用闭包来保持循环变量,这个之前解决for循环绑定事件中使用到过

3.IIFE(立即调用的函数表达式),在引用了外部变量的时候,也会形成闭包,形成一个独立的作用域,防止变量污染

闭包注意点

1.闭包会使得父级作用域的变量都被保存在内存中,内存消耗大,在IE中可能会导致内存泄漏。少用闭包,或者将不使用的局部变量全部删除

2.父级作用域的变量是共享,一个闭包修改了变量的值,其他闭包的值获取的值也会发生变化,容易产生错误

分析题:

function fun(a, b) {
          
            console.log(b);
            return {
                fun1:function(c){

                    return fun(c,a);
                }
            }
        }

var d = fun(0);  
d.fun1(1);
d.fun1(2);
d.fun1(3);

一、var d = fun(0);这一步执行后;d为{fun1:function(c){return fun(c,a);}},此时fun函数内部a的值为0、b的值为undefined;输出b

 还是d这个对象,访问到a的值一直为0

二、d.fun1(1);==>调用自己的函数,此时c=1,返回一个fun(c,a),第一步里a的值为0,把值带入就是fun(1,0)。此时输出b的值就等于0;

三、d.fun1(2);==>调用自己的函数,此时c=2,返回一个fun(c,a),第一步里a的值为0,把值带入就是fun(2,0)。此时输出b的值就等于0;以此类推。。。。

所以输出结果为:undefined ,0,0,0

var d1 = fun(0).fun1(1).fun1(2).fun1(3).fun1(4);// 迭代

这一个输出就不一样,这每一次调用都是上一次返回的fun1,

d1.fun(0)--------a=0,b=undefined

d1.fun(0).fun1(1)--------这个fun(1),访问到的是上一次的a,所以返回fun(1,0);回头执行fun,把1赋给a,0赋给b

以此类推:输出undefined,0,1,2,3

标签:闭包,fun1,变量,JavaScript,var,fun,闭包题,函数
来源: https://blog.csdn.net/m0_58510118/article/details/122608829

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有