闭包
不同作用域之间不能够相互访问,但是我们如果在一个函数内部在定义一个函数,并且这个内部函数与外部函数的变量有关联,那么就可以通过返回这个内部函数,然后来返回外部函数里面的变量,所以闭包其实就是函数内部和函数外部的一个联系。
function a () { var demo1 = 123; add = function () { demo1 ++; } return function () { console.log(demo1); }; } var demo = a(); demo(); // 123 add(); demo(); // 124当函数执行完之后,函数的执行上下文就会被销毁,就无法访问里面的变量,但这个函数返回了一个依赖这个函数的新函数,也就是说这个没有被销毁的新函数的作用域链中还存在着对原来函数的作用域的引用,就导致我们原本的函数的上下文不会被销毁,这样的话我们就可以在外部,继续使用这个被销毁的函数的变量了。
闭包会造成的问题
当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,造成内存泄露。
例:
function a() { var num = 1; function add() { num++; console.log(num); } return add; } var demo = a(); demo(); //2 demo(); //3 var demo1 = a(); demo(); //2 demo(); //3定义:此类函数没有声明,在一次执行过后即释放,常被用作初始化工作。
立即执行函数是解闭包的一个重要方法。
例:
var arr = [1,2,3,4,5]; var len = arr.length; for (var i = 0; i < len; i++) { window.setTimeout(function () { console.log(arr[n]); },2000); }上述代码,运行结果并不是隔2秒后输出1,2,3,4,5,而是输出5个undefined,这就是闭包产生的问题,由于闭包问题的存在,当setTimeout函数执行的时候i已经是6了,但是arr[6]并没有值,就导致输出5个undefined。
通过立即执行函数就可以解决上述问题:
==主页传送门==