JavaScript之闭包
2017-05-06 23:22
134 查看
闭包
不同作用域之间不能够相互访问,但是我们如果在一个函数内部在定义一个函数,并且这个内部函数与外部函数的变量有关联,那么就可以通过返回这个内部函数,然后来返回外部函数里面的变量,所以闭包其实就是函数内部和函数外部的一个联系。
当函数执行完之后,函数的执行上下文就会被销毁,就无法访问里面的变量,但这个函数返回了一个依赖这个函数的新函数,也就是说这个没有被销毁的新函数的作用域链中还存在着对原来函数的作用域的引用,就导致我们原本的函数的上下文不会被销毁,这样的话我们就可以在外部,继续使用这个被销毁的函数的变量了。
闭包会造成的问题
当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,造成内存泄露。
例:
立即执行函数是解闭包的一个重要方法。
例:
上述代码,运行结果并不是隔2秒后输出1,2,3,4,5,而是输出5个undefined,这就是闭包产生的问题,由于闭包问题的存在,当setTimeout函数执行的时候i已经是6了,但是arr[6]并没有值,就导致输出5个undefined。
通过立即执行函数就可以解决上述问题:
==主页传送门==
不同作用域之间不能够相互访问,但是我们如果在一个函数内部在定义一个函数,并且这个内部函数与外部函数的变量有关联,那么就可以通过返回这个内部函数,然后来返回外部函数里面的变量,所以闭包其实就是函数内部和函数外部的一个联系。
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 4000 ; i < len; i++) { window.setTimeout(function () { console.log(arr ); },2000); }
上述代码,运行结果并不是隔2秒后输出1,2,3,4,5,而是输出5个undefined,这就是闭包产生的问题,由于闭包问题的存在,当setTimeout函数执行的时候i已经是6了,但是arr[6]并没有值,就导致输出5个undefined。
通过立即执行函数就可以解决上述问题:
==主页传送门==
相关文章推荐
- 深入理解Javascript闭包
- javascript深入理解js闭包
- JavaScript深入浅出————OOP(闭包,作用域)(八)
- 每天一个JavaScript实例-使用带有定时器的函数闭包
- 学习Javascript闭包(Closure)
- Javascript中的闭包
- Javascript用闭包实现领域建模
- Javascript 闭包与高阶函数 ( 一 )
- JavaScript重构(五):利用原型和闭包,完成组件方法
- javascript变量提升和闭包理解
- 全面理解Javascript闭包和闭包的几种写法及用途
- javascript执行上下文、作用域与闭包(第四篇)---作用域与执行上下文
- 深入理解javascript原型和闭包(1)-->一切都是对象
- javascript---闭包
- JavaScript 的核心,闭包和作用域
- Javascript--匿名函数和闭包
- javascript的闭包
- 深入理解javascript原型和闭包(完结) (超赞)
- javascript 立即执行函数(IIFE)与闭包
- 学习Javascript闭包(Closure)