JavaScript闭包题

闭包

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

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

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

例如:

如果想使用函数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

上一篇:为数不多的人知道的-Kotlin-技巧以及-原理解析(二),移动端跨平台开发大型项目


下一篇:结构体基础练习1(getchar)