for var let闭包理解
let、 var、 setTimeout,一点思考。
for(var i = 0; i < 10; i++){
setTimeout(function(){
console.log(i);
},100);
}
结果是很显而易见的,10次都是10,在面试前端的闭包知识时候很常见。
用上let之后,
for(let i = 0; i < 10; i++){
setTimeout(function(){
console.log(i);
},100);
}
结果是:
0、1、2、3、4、5、6、7、8、9
为什么var和let声明的i,得到不同的结果?
var声明的i,作用域不仅仅在for循环内,还在for循环的外部。
当setTimeout执行的时候,for循环已经完成,i此时的值是10,我们稍微调整一下代码:
for(var i = 0; i < 10; i++){
setTimeout(function(){
consoleLog();
},100);
}
function consoleLog(){
console.log(i);
}
结果是10次10。
for(var i = 0; i < 10; i++)
和
var i;
for(i = 0; i < 10; i++)
等价。
但是在let声明的时候则不一样,
for(let i = 0; i < 10; i++)
和
let i;
for(i = 0; i < 10; i++)
是不等价的,因为let声明只在代码块中有效。
但是,如果仅仅这样,我们或许很容易理解
for(var i = 0; i < 10; i++){
setTimeout(function(){
console.log(i);
},100);
}
得到10次10,然而为什么
for(let i = 0; i < 10; i++){
setTimeout(function(){
console.log(i);
},100);
}
得到0-9?
在setTimeout的时候,匿名函数function(){console.log(i);}会被声明创建,当匿名函数执行的时候,会查找当前运行环境的 i 的值。
var声明的 i ,运行环境的 i 的值为10,但是let声明的 i,运行环境中 i 的值是每一个循环创建匿名函数时候的 i。
所以得到了0-9的值。
let替换var,可以很好的解决闭包的问题。
for var let闭包理解的更多相关文章
- .Net 闭包理解
.Net 闭包理解 这个东西初看是比较难懂,但是一旦理解之后就很容易了,做笔记以加深印象.且看这题 example.1 class Program { static void Main(string[ ...
- javascript闭包理解
//闭包理解一 function superFun(){ var _super_a='a'; function subfuc(){ console.log(_super_a); } return su ...
- JavaScript中的闭包理解
原创文章,转载请注明:JavaScript中的闭包理解 By Lucio.Yang 1.JavaScript闭包 在小学期开发项目的时候,用node.js开发了服务器,过程中遇到了node.js的第 ...
- javascript之闭包理解以及应用场景
半个月没写博文了,最近一直在弄小程序,感觉也没啥好写的. 之前读了js权威指南,也写了篇博文,但是实话实说当初看闭包确实还是一头雾水.现在时隔一个多月(当然这一段时间还是一直有在看闭包的相关知识)理解 ...
- JavaScript闭包理解【关键字:普通函数、闭包、解决获取元素标签索引】
以前总觉得闭包很抽象,很难理解,所以百度一下"闭包"概览,百度的解释是:“闭包是指可以包含自由(未绑定到特定对象)变量的代码块:这些变量不是在这个代码块内或者任何全局上下文中定义的 ...
- JavaScript ——闭包理解
昨天晚上听别人谈起闭包这个东西,虽然对js有一点了解但却丝毫没有印象,今天也没什么事就顺便研究了一下满足好奇宝宝.整合于网上的理解,记录一下. 一.闭包的作用域 要理解闭包,首先必须理解Javascr ...
- js闭包理解实例小结
Js闭包 闭包前要了解的知识 1. 函数作用域 (1).Js语言特殊之处在于函数内部可以直接读取全局变量 <script type="text/javascript"> ...
- 对于 Javascript 闭包理解
一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...
- JS闭包理解_摘
原文地址1:http://www.cnblogs.com/mzwr1982/archive/2012/05/20/2509295.html 闭包是一个比较抽象的概念,尤其是对js新手来说.书上的解释实 ...
随机推荐
- c#无边窗体实现移动的两种方式
转载:http://blog.csdn.net/dxsh126/article/details/2940226 首先,要用到一个WimdowsAPI函数,因此必须引入 using System.Run ...
- ubuntu将python3设为默认后再安装支持python3.x的包
简介: ubuntu默认python2.7版本,如果想要装python3.x版本,请记住python2.7版本一定不能卸载!!!但是即使我 python3.x版本安装成功,当运行python脚本时,系 ...
- opencv3.2.0 分离颜色通道&多通道图像混合
##名称:分离颜色通道&多通道图像混合 ##平台:QT5.7.1+OpenCV3.2.0 ##时间:2017年12月11日 /***************创建QT控制台程序********* ...
- android studio使用openssl
前言 逆向的基础是开发, 逆向分析时很多时候会使用一些公开的加密函数来对数据进行加密,通过使用 openssl 熟悉下. 正文 首先得先编译出来 openssl,然后把它们复制到你的工程目录下. in ...
- 润乾报表一个页面中的echarts地图与其他区块的联动
需求概述: DBD样式效果如下图所示,需要点击左侧地图中的地区,右侧的仪表盘,柱线图可以对应显示对应该地区的数据. 实现思路: 分别制作带有地图.仪表盘.柱线图的3张报表:将3张报表放到DBD中设置布 ...
- 612.1.004 ALGS4 | Elementary Sorts - 基础排序算法
sublime编辑器写代码,命令行编译 减少对ide的依赖//可以提示缺少什么依赖import 所有示例代码动手敲一遍 Graham's Scan是经典的计算几何算法 shffule 与 map-re ...
- BlockingQueue介绍及使用
1.BlockingQueue队列和平常队列一样都可以用来作为存储数据的容器,但有时候在线程当中 涉及到数据存储的时候就会出现问题,而BlockingQueue是空的话,如果一个线程要从Blockin ...
- idea springboot应用启动
在idea里启动springboot应用最好使用 spring-boot:run 如果通过运行main方法启动应用,会找不到页面
- shell_processing
1.文本处理_2:grep,sed,awk 2.regular_expression 3.Test 一.文本处理_2 1.grep --Linux处理正则表达式的主要程序.正则表达式是一种符号表示 ...
- Oracle EBS 取总账期间
--取期间 select GPS.EFFECTIVE_PERIOD_NUM, GPS.PERIOD_NAME from GL_PERIOD_STATUSES GPS AND (GPS.SET_OF_B ...