前提

ES5只有函数作用域和全局作用域,var属于ES5。let属于ES6,新增块级作用域。目的是可以写更安全的代码。

The let statement declares a block scope local variable, optionally initializing it to a value. - MDN

区别

  1. let声明的变量绑定到最近的块级作用域(用{}括起来的)。var绑定到最近的函数作用域或者全局作用域(例如浏览器是window,node是global)。 - stackoverflow
  2. let和var都存在变量提升(hoisting)。但let在声明之前不能访问这个变量(暂时性死区) - 参考1 参考2 参考3

例子1,for loop中的var

for (var i = 0; i < 10; i++) {
setTimeout(function() { // 同步注册回调函数到异步的任务队列。
console.log(i); // 执行这里时,同步代码for循环已经执行完成。
}, 0);
} //输出10个10

第一点,var声明的变量绑定到全局作用域,例如浏览器的window对象。第二点,for是同步代码,setTimeout是回调函数(异步编程的一种)。

所以当执行异步队列中的setTimeout里面的console.log执行时,for循环已经完成了,i的值为10,可以用window.i或者global.i查看。

例子2,for loop中的let

for (let i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 0);
} // 输出0 1 2 3 4 5 6 7 8 9,符合常理

因为let声明的变量把i绑定到for循环的块级作用域。

例子3,let和var都存在变量提升,只是let不能在声明前调用

拓展延伸 TS;DR: Too short don't read.

JavaScript - let和var区别的更多相关文章

  1. javascript中加var和不加var的区别

    Javascript是遵循ECMAScript标准下的一个产物,自然ECMAScript的标准其要遵循. 先来看下var关键字的定义和用法 var 语句用于声明变量. JavaScript 变量的创建 ...

  2. javascript中&&和||的区别

    javascript中&&和||的区别 &&和||操作符两边不是布尔类型时,系统会转换成布尔类型值再计算(空字符串.null.0都会被转成false),结果本身不变. ...

  3. javascript中=、==、===区别详解

    javascript中=.==.===区别详解今天在项目开发过中发现在一个小问题.在判断n==""结果当n=0时 n==""结果也返回了true.虽然是个小问题 ...

  4. let与var区别

    <!DOCTYPE html> <html> <head> <title>let与var区别</title> <meta charse ...

  5. JQuery和JavaScript常用方法的一些区别

    jquery 就对javascript的一个扩展,封装,就是让javascript更好用,更简单,为了说明区别,下面与大家分享下JavaScript 与JQuery 常用方法比较   jquery 就 ...

  6. JavaScript与java语法区别

    网页中各种技术的作用 感谢大佬:https://blog.csdn.net/RookiexiaoMu_a/article/details/89052768 HTML 制作网页的结构 CSS 美化网页 ...

  7. a href=#与 a href=javascript:void(0) 的区别

    a href="#"> 点击链接后,页面会向上滚到页首,# 默认锚点为 #TOP <a href="javascript:void(0)" onCl ...

  8. 超链接的#和javascript:void(0)的区别

    转载于:http://www.uw3c.com/cssviews/css12.html   在工作中,如果我们想把a标签中的链接置成空链接,我们一般会用两种方法: 1 <a href=" ...

  9. 转载 a href=#与 a href=javascript:void(0) 的区别

    a href="#"> 点击链接后,页面会向上滚到页首,# 默认锚点为 #TOP <a href="javascript:void(0)" onCl ...

随机推荐

  1. vs2017+resharper之常用快捷键备忘

    1.安装resharper后以vs2017的快捷键为主,让resharper作为一些方便的快捷键的补充. 2.vs2017的c++6的键盘布局模式快捷键 IntelliSence: 列表成员: Ctr ...

  2. google protocol 入门 demo

    ubunbu系统下google protobuf的安装 说明: 使用protobuf时需要安装两部分: 第一部分为*.proto文件的编译器,它负责把定义的*.proto文件生成对应的c++类的.h和 ...

  3. python之路模块

    time模块 print time.time() print time.mktime(time.localtime()) print time.gmtime() #可加时间戳参数 print time ...

  4. range()用法

    来源:http://www.cnblogs.com/wangwp/p/4535299.html 例子:http://www.cnblogs.com/hongten/p/hongten_python_r ...

  5. C++-数据抽象入门

    一.假定数据是如何存储的 隐藏某些实现逻辑时,我们是想要隐藏绘制子弹的细节.我们是通过使用一个可以调用的函数,而不是直接写出绘制子弹到屏幕上的代码来实现的.这里同样可以使用一个函数来隐藏棋盘存储的细节 ...

  6. 【转】C# Application.DoEvent()的作用

    Application.DoEvents()的作用:处理所有的当前在消息队列中的Windows消息. private void button1_Click(object sender, EventAr ...

  7. VIM键盘映射 (Map)

    http://www.pythonclub.org/linux/vim/map VIM键盘映射 (Map) 设置键盘映射 使用:map命令,可以将键盘上的某个按键与Vim的命令绑定起来.例如使用以下命 ...

  8. java 数字转换格式化

    1.小数格式化后转字符串百分数(带%)输出 NumberFormat nt = NumberFormat.getPercentInstance(); //设置百分数精确度2即保留两位小数 nt.set ...

  9. 2019HDU多校第一场1001 BLANK (DP)(HDU6578)

    2019HDU多校第一场1001 BLANK (DP) 题意:构造一个长度为n(n<=10)的序列,其中的值域为{0,1,2,3}存在m个限制条件,表示为 l r x意义为[L,R]区间里最多能 ...

  10. sourcetree(mac)设置代理

    Mercurial: edit ~/.hgrcas shown here: http://www.selenic.com/mercurial/hgrc.5.html#http-proxy Git: e ...