关于闭包的面试题引发的思考
来源:互联网 发布:淘宝销量排行榜查询 编辑:程序博客网 时间:2024/05/17 06:50
闭包
一直想写个闭包的总结,无奈自己理解的太渣,不敢乱写,最后还是想写一点东西。
关于闭包,在我目前学习的理解中,就是闭包它是会驻留在内存中,不会被js垃圾回收机制清除,因此它也是模拟的全局变量,也就是说它的this指向window。而目前我的知识范围的闭包就是函数内部又定义了一个函数,由于js的作用域链是由里向外,也就是只有内部的函数可以去找外部的变量。而你外部要想取到我内部的变量,那么闭包就派上用场。你可以通过return来获取到内部的变量。
示例1
function box(){ var arr=[]; for(var i=0;i<5;i++){ arr[i]=function(){ return i; } } return arr;}var b=box();for(var i=0;i<5;i++){ alert(b[i]());}典型的闭包问题,alert全是5。为啥?仔细看,当你执行到alert这行时,arr是不是已经执行得到了?也就是说你是之后再进行box()()的调用,也就是函数内部的函数是b[i]()时执行。那么你第一个for循环是不是已经执行完毕得到i=4?由于循环执行完毕,又加了一次,也就是结果是5。没有问题,那么要怎么去解决它呢?首先你要想得到0,1,2,3,4那么就是把它们存在一个地方,也就自然的想到了闭包,因为闭包可以将变量存起来。那么改写如下:function box(){ var arr=[]; for(var i=0;i<5;i++){ arr[i]=(function(i){ return function(){ return i; } })(i) } return arr;} 匿名函数function(){return i}将变量i存储在内存中。利用了闭包的特性。还有一种方法,你直接让他立即执行,不是在调用的时候执行,不也是得到正确的结果么?function box(){ var arr=[]; for(var i=0;i<5;i++){ arr[i]= function (){ return i ; }(); } return arr;}var b=box();for(var i=0;i<5;i++){ alert(b[i]);}其实简单粗暴直接arr[i]=i;也能得到结果。
示例2
知乎上看到的题目: for(var i=0;i<5;i++){ setTimeout(function(){ console.log(i); },1000*i) } 执行的结果是5,5,5,5,5隔一秒一个5。为啥?和上面的类似,你延时执行,哪怕是0秒他也不是立即执行,涉及到定时器函数队列的问题,还不是太明白。意思就是你设置了定时器,他会将函数放到类似的执行队列上,而没有设置定时器的函数依然在他前面执行。回到这题,你延时执行,for循环已经走完,i=5,结果就是一秒一个5。 解决问题: 1.想到闭包: 现在想让i=0,1,2,3,4是吧,也就是说你内部将i存起来,不就解决了么。也就是: for(var i=0;i<5;i++){ (function(t){ setTimeout(function(){ console.log(t); },1000*t) })(i) } 2.如果你立即执行,不也可以么? for(var i=0;i<5;i++){ setTimeout((function(){ console.log(i); })(),1000*i) } 不过这样写问题也在,你会立马输出0,1,2,3,4。
以上就是目前我对闭包的理解,其实感觉还是很模糊的概念。就是知道有那么个东西但是用不好,可能是我现阶段的知识层面还没有达到那个层次。最后,写的可能有不对的地方欢迎指正~
0 0
- 关于闭包的面试题引发的思考
- 关于内存面试题引发的思考
- 由一道面试题引发的思考
- 一道C面试题引发的思考
- 由一个面试题引发的思考
- 百度一道面试题引发的思考
- 一道面试题引发的思考
- 一道360面试题引发的思考
- 一道360面试题引发的思考
- 一道面试题引发的思考
- 一道面试题引发的思考
- 一道js面试题引发的思考
- 一道面试题引发的思考
- (续)一道面试题引发的思考
- 一个java面试题引发的思考
- 一道 JS 面试题引发的思考
- 一道面试题引发的思考
- 网易面试题引发的思考
- ACM
- 引用传值和指针传值的区别
- 設計模式之王
- EcShop的foreach使用方法和三层嵌套
- go语言入门-搞定cmd
- 关于闭包的面试题引发的思考
- 三栏布局的两边定宽100px,中间自适应
- 对象数组+对象指针+指向对象的指针
- 【maven】3、Maven快速Demo
- SourceTree冲突解决(Windows)
- 声明ViewHolder(或Handler)内部类时,建议使用static关键字的原因
- Arrays.tostring和a.toString返回的问题
- HTML5canvas时钟实例
- 框架开发之Java注解的妙用