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新手来说.书上的解释实 ...
随机推荐
- Linux sar命令工具详细介绍
sar命令工具详细介绍 by:授客 QQ:1033553122 由于篇幅限制,采用网盘分享, 下载地址: sar命令工具详细介绍.pdf
- Two ways to invert a string
package com.itheima_07; import java.util.Scanner; /* * 字符串反转 * 举例:键盘录入”abc” * 输出结果:”cba” * * 分析: * A ...
- 如何让你的Ssh连接,更加安全?
希望你会涨姿势. First: vim /etc/ssh/sshd_config 在Port 22下面加一行,以端口1438为例,Port 1438 然后保存,重启ssh服务 systemctl re ...
- JQuery 常用命令总结
下面介绍在jQuery中设置form表单中action的值的方法. $("#myFormId").attr("action", "userinfo.s ...
- 2. 跟踪标记 (Trace Flag) 3604, 3605 输出DBCC命令结果
跟踪标记:3604 功能: 输出DBCC命令返回结果到查询窗口(通常是SSMS窗口),类似print命令的显示效果: 用途: 常用于获取DBCC IND, DBCC PAGE命令的输出结果,因为这2个 ...
- Top 25 Most Frequently Asked Interview Core Java Interview Questions And Answers
We are sharing 25 java interview questions , these questions are frequently asked by the recruiters. ...
- 铁乐学Python_day08_文件操作
一.[基本的文件操作] 参数: 1.文件路径: 2.编码方式: 3.执行动作:(打开方式)只读,只写,追加,读写,写读! #1. 打开文件,得到文件句柄并赋值给一个变量 f = open('E:/Py ...
- 安装Stunnel来实现正向代理邮件
文:铁乐与猫 2017年8月 一开始我是使用yum install来安装stunnel的 感觉版本低点也无所谓,毕竟只是拿来加密代理一下邮件收发. 可是后来发现之前下载的最新官网版本的tar包里有很多 ...
- Hadoop HBase概念学习系列之物理视图(又名为物理模型)(九)
虽然,从HBase的概念视图来看,每个表格是由很多行组成的,但是在物理存储上面,它是按照列来保存的,这一点在进行数据设计和程序开发的时候必须牢记. 在物理存储上面,它是按照列来保存的 需要注意的是,在 ...
- CSS-定位属性
Css学习——定位属性 定位可以看作是一种分层,通过对页面中的各种元素进行定位,可以将某些元素放到其他元素的上层,并在浏览器的窗口中设置这些元素的具体位置. position属性以及Css所提供的4中 ...