var是ES5定义变量的一种声明方式。

let是ES6定义变量的一种声明方式---可定义局部变量,即定义块级作用域。

  • 以下列简单的函数进行表现二者作用域的不同

在ES6之前,我们都是用var来声明变量,而且JS只有函数作用域和全局作用域,没有块级作用域,所以{}限定不了var声明变量的访问范围。

{
  var i=0
}
console.log(i) //输出0

ES6新增的let,可以声明块级作用域的变量。

{
let i=0
}
console.log(i) //输出“Uncaught ReferenceError: i is not defined”以简单
  • 以简单示例表现二者提升变量的不同

因为变量被提升了,但是输出在赋值之前,所以,未找到aicoder的值,输出“undefined”

console.log(aicoder);    // “undefined”
var aicoder = 'aicoder.com'

在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”。

console.log(aicoder);    // 错误:Uncaught ReferenceError: Cannot access 'aicoder' before initialization
let aicoder = 'aicoder.com'; // 这之后就可以安全使用aicoder
  • 与for循环的独特应用
for (var i = 0; i < 5; i++) {
setTimeout(() => {
console.log("var", i)
}, 1000)
}

 输出:一秒后,输出5个5
 因为var,导致最后i成为5
 函数执行顺序:
 ->开始同步
 ->for循环5次,并向异步中推5个timeout函数
 ->同步结束
 ->开始异步
 ->同时开始执行5个timeout函数(因为i是全局变量,所以,外部for循环结束时,i为5,则timeout函数i也发生变化,变为5)
 ->异步结束
 ->打印结果:一秒后,同时输出5个5

---------------------------------------------------------------------------------

for (let i = 0; i < 5; i++) {
setTimeout(() => {
console.log("let", i)
}, 1000)
}

 输出:一秒后,同时输出01234
 因为let,let限制了参数作用域
 函数执行顺序:
 ->开始同步
 ->for循环5次,并向异步中推5个timeout函数
 ->同步结束
 ->开始异步
 ->同时开始执行5个timeout函数(虽然i在变化,但传入timeout函数的i已经拥有了块作用域,所以并不会因为外部的改变而改变)
 ->异步结束
 ->打印结果:一秒后,同时输出01234

---------------------------------------------------------------------------------

ES6的let让js真正拥有了块级作用域,也是向这更安全更规范的路走,虽然加了很多约束,但是都是为了让我们更安全的使用和写代码。

以for循环的方式了解var与let的区别的更多相关文章

  1. JavaScript的几种循环使用方式及性能解析

    循环的类型 一:for var arr = [1, 2, 3, 4, 5, 6]; for (var i = 0, len = arr.length; i < len; i++) { conso ...

  2. ArrayList和LinkedList的几种循环遍历方式及性能对比分析(转)

    主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayList和LinkedList的源码实现分析性能结果,总结结论. 通过本文你可以 ...

  3. ArrayList和LinkedList的几种循环遍历方式及性能对比分析

    最新最准确内容建议直接访问原文:ArrayList和LinkedList的几种循环遍历方式及性能对比分析 主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性 ...

  4. ArrayList和LinkedList的几种循环遍历方式及性能对比分析(转载)

    原文地址: http://www.trinea.cn/android/arraylist-linkedlist-loop-performance/ 原文地址: http://www.trinea.cn ...

  5. HashMap循环遍历方式及其性能对比(zhuan)

    http://www.trinea.cn/android/hashmap-loop-performance/ ********************************************* ...

  6. HashMap循环遍历方式及其性能对比

    主要介绍HashMap的四种循环遍历方式,各种方式的性能测试对比,根据HashMap的源码实现分析性能结果,总结结论.   1. Map的四种遍历方式 下面只是简单介绍各种遍历示例(以HashMap为 ...

  7. 【转】ArrayList和LinkedList的几种循环遍历方式及性能对比分析

    原文网址:http://www.trinea.cn/android/arraylist-linkedlist-loop-performance/ 主要介绍ArrayList和LinkedList这两种 ...

  8. Java 集合 ArrayList和LinkedList的几种循环遍历方式及性能对比分析 [ 转载 ]

    Java 集合 ArrayList和LinkedList的几种循环遍历方式及性能对比分析 @author Trinea 原文链接:http://www.trinea.cn/android/arrayl ...

  9. jQuery中的for循环var与let的区别

    今天在写jQuery请求接口中发现一个问题: 在用AJAX发送请求中又嵌套了一个AJAX请求,发现在内层请求的success中对第一次success中的循环变量 i 无法获取,具体代码如下: $.aj ...

随机推荐

  1. Qt在Windows上的调试器安装与配置

    如果安装Qt时使用的是Visual Studio的预编译版,那么很有可能就会缺少调试器(Debugger),而使用MSVC的Qt对应的原生调试器是CDB(对应MinGW的Qt使用GDB调试器).本文介 ...

  2. Unity 入門 - 延遲解析

    本文大纲: 小引 共享的范例代码 使用 Lazy<T> 使用自动工厂 注入自定义工厂 小引 当我们说「解析某个型别/组件」时,意思通常是呼叫某类别的建构函式,以建立其实例(instance ...

  3. abp(net core)+easyui+efcore仓储系统——定义仓储并实现 (四)

    abp(net core)+easyui+efcore仓储系统目录 abp(net core)+easyui+efcore仓储系统——ABP总体介绍(一) abp(net core)+easyui+e ...

  4. vuex分模块4

    Vuex下Store的模块化拆分实践 https://segmentfault.com/a/1190000007667542 vue.js vuex 猫切 2016年12月02日发布 赞  |   1 ...

  5. jQuery中ajax-$.getJSON,$.getScript

    jQuery提供了两个特定异步加载的方法$.getJSON()方法和$.getScript()方法 $.getJSON()来加载特定的json文件 $.getScript()来加载特定的javascr ...

  6. TCP/IP协议栈---网络基础篇(3)

    TCP/IP协议栈 在网络中实际使用的是TCP/IP,OSI是参考模型. TCP/IP协议栈 – 是由一组不同功能的协议组合在一起构成的协议栈 – 利用一组协议完成OSI所实现的功能 应用层协议 传输 ...

  7. PCA(主成分分析)算法

    设有\(m\)个指标,\(n\)个样本的原始数据 将原始数据按列组成矩阵 \(X _ { n \times m }\) 将\(X\) 的每一列进行中心化 求\(X\)的协方差矩阵\(\Sigma _ ...

  8. POJ 1485:Fast Food(dp)&& 面试题

    题目链接 题意 给出 n 个餐厅,m 个停车场,现在要将 n 个餐厅中的 m 个变成停车场,使得每个餐厅到最近的停车场的距离之和最短,输出哪个餐厅变成停车场和它服务哪些餐厅,还有最短距离之和. 思路 ...

  9. windows container 踩坑记

    windows container 踩坑记 Intro 我们有一些服务是 dotnet framework 的,不能直接跑在 docker linux container 下面,最近一直在折腾把它部署 ...

  10. 西门子 S7-300 PLC 从入门到精通的100个经典问题

    1:使用CPU 315F和ET 200S时应如何避免出现“通讯故障”消息?   使用CPU S7 315F, ET 200S以及故障安全DI/DO模块,那么您将调用OB35 的故障安全程序.而且,您已 ...