var声明变量:

var只有函数作用域,没有块级作用域

//函数作用域的表现
function test(){
var i =10;
console.log(i); //
}
test(); //
console.log(i); // i is not defined; //块级作用域对var没有约束
{
var i = 10;
console.log(i); //
}
console.log(i); //

从上面的代码可了解到,块级作用域对var是没有约束作用的。

let声明变量:

let与var不同,let是有块级作用域的。

//块级作用域对let声明的变量有约束
{
let i = 10;
console.log(i); //
}
console.log(i) //ReferenceError

了解了上面的特性再来看看,var和let在for循环的一些不同表现:

//var声明i
function test(){
for(var i=0;i<2;i++){
setTimeout(()=>{
console.log(i);
},0);
}
}
test();
//输出结果:2、2 //let声明i
function test(){
for(var i=0;i<2;i++){
setTimeout(()=>{
console.log(i);
},0);
}
}
test();
//输出结果:0、1

可以看到只是声明方式不一样,输出的结果却有很大的差异。

在此之前还需要了解setTimeout()的执行机制:

setTimeout()是以异步的方式执行的。在执行for循环的时候,并不是执行一次for循环就立刻执行一次setTimeout(),而会让setTimeout()进入另一条线程进行等待,当主线程(这里就是test())执行完后,setTimeout()再依次执行。

在var中执行的时候:

因为var是没有块级作用域的,所以在for循环中声明的i会存在于test()函数作用域中。每一次for循环就会声明一次i,但后面声明的变量会覆盖前面声明的变量。所以当for循环执行完后(此时setTimeout()还未被执行),函数作用域中的i的值就变成2了

而setTimeout()所在的线程中是这样的:

//第一次进栈
setTimeout(()=>{
console.log(i);
}); //第二次进栈
setTimeout(()=>{
console.log(i);
});

这里的i都指向函数作用域中的i。所以输出都为2。

在let中执行的时候:

因为块级作用域的原因,let声明的i都会存在于for块级作用域中,每一次for循环都会生成一个块级作用域。所以setTimeout()在线程中是这样的:

{
let i=0;
setTimeout(()=>{
console.log(i);
});
} {
let i=1;
setTimeout(()=>{
console.log(i);
});
}

所以会一次输出0,1;

let和var在for循环中的不同表现的更多相关文章

  1. var与let循环中经典问题

    循环1: 下面代码运行结果是输出10   <script> var a =[]; for(var i = 0;i<10;i++){ a[i] = function(){ consol ...

  2. 对于for循环中使用let或var时,i的作用域范围的记录

    在for循环中使用let时,结果如下 for内部定义的i在循环结束后不会覆盖外部的i 在for循环中使用var,且不控制i的作用域时,结果如下 第一个for循环内部定义的i并不会创建,而是直接使用外部 ...

  3. 三. var let const的理解 以及 立即执行函数中的使用 以及 for循环中的例子

    一. 立即执行函数 windows中有个name属性,name='' '' var 如果我们用var name 去声明,那就会改变windows中name的值(因为我们不是在函数作用域中声明的,所以会 ...

  4. js for 循环中的 变量问题。

    今日处理项目中的一个循环,本来就是一个小小的for循环,后来发现该段程序出现了问题,仔细检查代码没有发现其中的错误.无奈只好叫来了老大帮忙.通过在模版中断点调试(该方式只能自己写debugger断点) ...

  5. js模版引擎handlebars.js实用教程——循环中使用索引

    <!DOCTYPE html> <html> <head> <META http-equiv=Content-Type content="text/ ...

  6. Handlebars.js循环中索引(@index)使用技巧(访问父级索引)

    使用Handlebars.js过程中,难免会使用循环,比如构造数据表格.而使用循环,又经常会用到索引,也就是获取当前循环到第几次了,一般会以这个为序号显示在页面上. Handlebars.js中获取循 ...

  7. jsrender-for循环中访问父属性

    jsrender中使用for循环数据时有时需要访问父级数据. 而jsrender在循环中的父级数据存放在隐藏属性parent.parent.data中,使用案例如下 {{:#parent.parent ...

  8. JQuery在循环中绑定事件的问题详解

    JQuery在循环中绑定事件的问题详解 有个页面上需要N个DOM,每个DOM里面的元素ID都要以数字结尾,比如说 ? 1 2 3 <input type="text" nam ...

  9. bash的循环中无法保存变量

    在bash中,如果循环在一个子shell中运行,那么在循环中对循环外面的变量的更改将在循环退出后不可见.像下面的例子: #!/bin/sh python run.py | while read lin ...

随机推荐

  1. [LC] 295. Find Median from Data Stream

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...

  2. synchronized互斥锁实例解析

    目录 synchronized互斥锁实例解析 1.互斥锁基础使用:防止多个线程同时访问对象的synchronized方法. 1.1.多个线程调用同一个方法 1.2.多个线程多个锁,升级为类锁 2.线程 ...

  3. Qt5 提示:无法启动此程序,计算机丢失Qt5Widgetsd.dll的解决方法

    Qt5工程编译生成可执行的exe文件之后,运行提示无法启动此程序,计算机丢失Qt5Widgetsd.dll… 原因是没有设置好Qt5的环境变量,解决方法如下: 1.打开[环境变量],(不同的系统会有不 ...

  4. python3的数据类型转换问题

    问题描述:在自我学习的过程中,写了个登陆,在input处,希望能够对数据类型进行判断,但是因为python3的输入的数据会被系统默认为字符串,也就是1,1.2,a.都会被系统默认为字符串,这个心塞啊, ...

  5. Oauth2.0 协议简介及 php实例代码

    转自:http://www.dahouduan.com/2017/11/21/oauth2-php/ https://blog.csdn.net/halsonhe/article/details/81 ...

  6. 在angular中自定义筛选管道

    Angular 内置了一些管道,比如 DatePipe.UpperCasePipe.LowerCasePipe.CurrencyPipe 和 PercentPipe. 它们全都可以直接用在任何模板中; ...

  7. Hadoop的存储架构介绍

    http://lxw1234.com/archives/2016/04/638.htm 该文章介绍了Hadoop的架构原理,简单易懂. 目前公司提供Hadoop的运算集群BMR,可以直接申请集群资源.

  8. Vuex安装使用

    vuex是以插件的方式存在的. 安装:打开项目的根目录,即package.json所在目录,执行以下命令: npm install vuex --save-dev 背景:小型应用里的每个组件维护着自有 ...

  9. CSAPC08台湾邀请赛_T1_skyline

    题目链接:CSAPC08台湾邀请赛_T1_skyline 题目描述 一座山的山稜线由许多片段的45度斜坡构成,每一个片段不是上坡就是下坡. / /​ * / ​/ * /  // ​/ // / 在我 ...

  10. Web自动化测试平台设计与落地-概览

    引言 自动化金字塔-灵魂手绘版 关于Web自动化测试,投入产出比是一个绕不开的话题,对于走到2017年的测试人,这时候可能已经有很多人会想到著名的自动化测试金字塔.它形象地展示了Mike Cohn对自 ...