闭包问题及解决

闭包的形成

当内部函数被保存到外部时,会形成闭包;闭包会导致原始作用域链不释放,造成内存泄漏(占用);


例如:


最后输出的结果是10个10;如图:


闭包问题及解决_第1张图片

我们的目的是输出0到9,但是结果输出了10个10,导致这种情况的原因就是闭包;


数组arr 被保存到外部,通过for循环,相当于将10个函数体保存到了外部,然后myArr是得到了test()的运行结果,通过函数外的for循环顺序执行这10个函数体;函数体里面只有一条语句,就是展示出i的值;


而为什么打印出来都是10呢?


因为在函数外输出时,看到的i执行完for循环操作后已经变成了10,因为在test()中,我们看到arr[i]被赋值为一个函数,此时这个赋值语句里面的函数体内容是不执行的,只是读语句,都声明和循环语句,而赋值语句后面的函数体不执行,只有在调用这个函数时,这个函数才执行;


意思就是说,arr[i]这个里面的i会跟着for循环语句一个一个的变,而它后面的函数体里面的i是不同时随着一起变的,不知道i为多少,只有当最后函数外面调用这个函数体时才会找这个语句里面i的值(就是最后myArr[j]()调用了),而此时i已经变成了10(因为上面for循环执行到i = 9时i++,此时i = 10,但是i不满足判断条件,赋值语句不执行,但是i已经变成了10);这就是闭包!!!


此时就是10对1;最后执行的函数,索取的i都是同一个i;所以执行了10次,得到十个10;


那怎么解决这个问题呢?

那么我们就是要让上面的函数体,当arr[i]中的i为几时,相应的函数体里面的输出i就为几,这样就能解决问题了;

那么就引入了立即执行函数,只有立即执行函数能解决这个问题,当函数出现的时候就被立即执行,i值的变化直接被变现;代码如下:

形参为j,实参为i;for循环十次,相当于十个立即执行函数;此时就是有十个函数对应十个引用;
此时,每执行一次i的for循环,传入一个实参,形参j也跟着改变,但此时赋值函数体依旧不执行,当外部执行时,对应的j的for循环从0到9刚好对应,此时 立即执行函数里面的j是十个不同的,外部循环对应起来找到每个对应的 立即执行函数,然后输出j,此时的结果就是0~9了;

闭包问题及解决_第2张图片


可见,利用立即执行函数解决了问题,得到想要的结果!!!




你可能感兴趣的:(学习笔记,前端学习)