在ES6中,应该尽量使用const和let来声明变量,而尽量避免使用var。

var的缺点是它的作用域比较混乱,使用let能够保证清晰的作用域。

下面看一个小例子。

var x = 3;
if(x==3) {
var x = 7;
}
console.log(x)//输出x=7 let y=4
if(y==4){
// var y=5//报错:y已经定义过
}
console.log(y)//输出4

给你出道题:编写一个html页面,一打开页面,就alert三次,每次alert的文本显示当前是第几次alert

<html>
<script>
for (var i = 0; i < 3; i++) {
setTimeout(function () {
alert("这是第" + i + "次")
}, 1000 * i)
}
</script>
</html>

写完运行,发现每次显示都是第3次。这是因为循环已经运行完了,i=3,然后才开始alert。

那么问题来了,如何把i的状态保存下来?

<html>
<script>
for (var i = 0; i < 3; i++) {
setTimeout(function () {
var j=i//使用var是没有用处的,使用let就对了
alert("这是第" + j + "次")
}, 1000 * i)
}
</script>
</html>

使用var j=i把i的状态保存下来,会发现并无卵用。因为3次循环var j是一个变量,而不是三份!我们想要实现的是保留三份j,这时使用let就可以实现了。

那么问题来了,let是ES6才有的,没有let之前人们是如何操作的呢?

<html>
<script>
for (var i = 0; i < 3; i++) {
(function (val) {
setTimeout(function () {
alert("这是第" + val + "次")
}, 1000 * i)
})(i)
}
</script>
</html>

由上面的小例子可以看出,let有严格的作用域而var没有。

正是因为let有严格的作用域,所以let会进行许多运行时检查,比如禁止重复定义。

let还有一种作用域的用法。

var x = 5;
var y = 0; let (x = x+10, y = 12) {
console.log(x+y); // 27
} console.log(x + y); // 5

参考资料

阮一峰-Javascript 严格模式详解

海洋天堂-js中let和var

js中的let和var的更多相关文章

  1. js中局部变量必须用var去声明

    js中的变量与其他的脚本语言都是很不一样的,在function中你如果不用var 声明一个变量,那么这个变量将在全局可见,也就相当于创建了全局变量.所以在function中声明变量尽量都是用var来声 ...

  2. 前端面试题:JS中的let和var的区别

    最近很多前端的朋友去面试被问到let和var的区别,其实阮一峰老师的ES6中已经很详细介绍了let的用法和var的区别.我简单总结一下,以便各位以后面试中使用. ES6 新增了let命令,用来声明局部 ...

  3. js中变量声明有var和没有var的区别

    转js中var用与不用的区别 2015年07月13日 16:08:22 阅读数:3627 Javascript声明变量的时候,虽然用var关键字声明和不用关键字声明,很多时候运行并没有问题,但是这两种 ...

  4. JS中的let和var的区别

    最近很多前端的朋友去面试被问到let和var的区别,其实阮一峰老师的ES6中已经很详细介绍了let的用法和var的区别.我简单总结一下,以便各位以后面试中使用. ES6 新增了let命令,用来声明局部 ...

  5. js中函数提升及var变量提示

    其中,在javascript中,函数声明及var声明的变量会得到提升.但是函数声明会先于var声明的变量被提升.即便function写在后面. 看下面的例子: var aa = 221; functi ...

  6. js中不容小觑的var声明

    在学习vue相关课程中,有一次跟着老师敲代码,写出了如下代码: var Child = { template:`<div @click='handleClick'><slot> ...

  7. js中定义变量之②var let const的区别

    var 上一篇文章有讲过,是js定义变量的关键词. 但是在es6中,新添加了两个关键词,用于变量声明的关键词:let 和const 接下来就说一下var let 和const的区别: 首先说var 用 ...

  8. js中定义变量加var与不加var的区别?

    var 不一定是用来定义局部变量的 jscript的全局变量和局部变量的分界是这样的:                  过程体(包括方法function,对象Object o ={})外的所有变量不 ...

  9. js中关键字 const , let , var 的用法区别

    1.const定义的变量不可以修改,而且必须初始化. 2.var定义的变量可以修改,如果不初始化会输出undefined,不会报错. 3.let是块级作用域,函数内部使用let定义后,对函数外部无影响 ...

随机推荐

  1. php的初步了解

    刚刚学习PHP,在学校中没有接触过这个语言,但是身边的人都说php好,经过这几天的学习,我对它的基础有了一定的认知和了解,php是“PHP Hypertext Preprocessor”的首字母缩写, ...

  2. 从volatile说到i++的线程安全问题

    简介 volatile关键字保证了在多线程环境下,被修饰的变量在别修改后会马上同步到主存,这样该线程对这个变量的修改就是对所有其他线程可见的,其他线程能够马上读到这个修改后值. Thread的本地内存 ...

  3. iOS:UIView视图与组件控件

    一.UIView常见属性  (1)@property(nonatomic,readonly)UIView *superview; //获取自己的父控件对象  (2)@property(nonatomi ...

  4. utf-8-validation

    https://leetcode.com/problems/utf-8-validation/ public class Solution { public boolean validUtf8(int ...

  5. iOS开发-多线程简介

    多线程从概念上理解是指从软件或者硬件上实现多个线程并发执行的技术,简单点理解就是同一时间可以执行多个事情(比如说一边听歌一边码代码),听歌是一个线程,码代码是一个线程,如果是单核CPU的话,上面两个动 ...

  6. Bootstrap学习js插件篇之提示框

    案例 受到Jason Frame开发的jQuery.tipsy插件的启发,我们才把这个工具提示插件做的更好,而且此插件不依赖图片,只是使用CSS3来实现动画效果,并使用data属性存储标题. 将鼠标悬 ...

  7. jQuery图片上传前先在本地预览

    js代码: /* *名称:图片上传本地预览插件 v1.1 *作者:周祥 *时间:2013年11月26日 *介绍:基于JQUERY扩展,图片上传预览插件 目前兼容浏览器(IE 谷歌 火狐) 不支持saf ...

  8. [转]DOM 中 Property 和 Attribute 的区别

    angular的文档: https://angular.io/guide/template-syntax#property-binding https://blog.csdn.net/sunq1982 ...

  9. Windows上使用“LogView”打开大文件

    最近因为工作需要要打开一个300+MB的文件,试过了N个编辑器不是打不开就是软件直接挂掉或是占用内存太大,已经严重影响了我的工作 还好在网络上找到老外写的一个免费软件,官网上说是可以打开4G+的文件( ...

  10. vs2013 密钥_

    vs2013 密钥 最佳答案: BWG7X-J98B3-W34RT-33B3R-JVYW9