获得徽章 0
- 闭包面试问题解答:
for (var i = 1; i < 6; i++) { setTimeout( function timer(){ console.log(i); },i*1000);}
输出5次6
原因:setTimeout的延迟不是绝对精确的;
setTimeout的意思是传递一个函数,延迟一段时候把该函数添加到队列当中,并不是立即执行;
所以说如果当前正在运行的代码没有运行完,即使延迟的时间已经过完,该函数会等待到函数队列中前面所有的函数运行完毕之后才会运行;也就是说所有传递给setTimeout的回调方法都会在整个环境下的所有代码运行完毕之后执行;
刚进入for循环的时候,i为1,所以相对于现在延迟一秒将timer函数添加到队列当中,然后for循环还要继续啊,并没有等一秒再继续循环啊,然后进行第二次循环,这时候i为2,所以相对于现在延迟两秒将timer函数送进队列。以此类推。for循环的时间忽略不计的话,timer函数就以每秒一次的频率执行啦。
为什么每次都显示6呢?
for(var i = 1; i <6; i++){...}中的i属于全局作用域,当settimeout函数执行时会向上级一层一层寻找,找到全局i,此时i为6.(再次提醒不要错误地认为要等timer函数执行之后才会继续循环);
解决办法一:for (var i = 1; i <6; i++) {
(function(i){
setTimeout( function timer() {
console.log(i);
}, 1000 );
})(i);
}
解决方法二:
for (let i = 1; i <6; i++) {
setTimeout( function timer() {
console.log(i);
}, j*1000 );
}
for(var i = 0 ; i < 6; i++){
setTimeout((function(i){
return function(){
console.log(i);
}
})(i),1000);
}
let原理:在ES6中let实际是为js新增了块级作用域,不用创造函数作用域就可以让每个函数访问各自作用域里的值,每次循环时候每个返回的函数引用的是其对应块作用域的变量
什么是闭包?
简言之, 闭包 是由函数引用其周边状态( 词法环境 )绑在一起形成的(封装)组合结构。在 JavaScript 中,闭包在 每个函数被创建时 形成。
闭包让我们能够从一个函数内部访问其外部函数的作用域 。要使用闭包,只需要简单地将一个函数定义在另一个函数内部内部函数将能够访问到外部函数作用域中的变量,即使外部函数已经执行完毕。
2.特性:
函数嵌套函数;
函数内部可以引用函数外部的参数和变量;
函数变量和参数不会被垃圾回收机制回收;
3.优缺点:
优点
- 希望一个变量长期驻扎在内存中
- 避免全局变量的污染
- 私有成员的存在
缺点
- 常驻内存,增大内存使用量,使用不当回造成内存泄漏;展开评论1 - Save to Pocket:一款保存文章、视频等资料的插件,当你在 Chrome 中找到要稍后查看的内容时,将它放入 Pocket,它会自动同步到手机,平板电脑或计算机,因此即使没有互联网连接,也可以随时查看
Chrome 下载地址:chrome.google.com
展开113 - ice:让前端开发简单而友好,海量可复用物料,配套桌面工具极速构建前端应用。模板比较多,样式易于定制,物料的概念很好。可用来极速构建中后台应用,官网:
alibaba.github.io
GitHub 地址:github.com
展开159 - 安利一款做 PPT 神器:Piti,这款 PPT 插件可以一键搜索几十个无版权图片库,高质量图片一键插入PPT,还拥有可能是目前最高质量的免费PPT模板库。官网地址:
www.piti.fun,除此之外还拥有一键搜索 logo
189 - YBImageBrowser 是一个 iOS 图片浏览器(支持视频),功能强大,性能优越,轻松集成,易于拓展。GitHub地址:
github.com
特性
支持 GIF,APNG,WebP 等本地和网络图像类型(由 YYImage、SDWebImage 提供支持)。
支持本地和网络视频。
支持系统相册图像和视频
支持高清图浏览。
支持屏幕旋转。
支持预加载提高用户体验。
支持数组或协议配置数据源,自由决定内存占用和交互性能的取舍。
支持数据重载。
支持文案更改,默认有英语和简体中文的适配。
支持业界流行的交互动效。
基于面向协议设计模式,轻松自定义 Cell、ToolBar、SheetView。
质量不错的代码细节和架构设计,易于拓展和维护。展开58 - pycorrector - 中文错别字纠正工具。音似、形似错字(或变体字)纠正,可用于中文拼音、笔画输入法的错误纠正(python3) by xuming GitHub:
github.com Demo:
www.borntowin.cn
115