学习了阮一峰老师的ES6,http://es6.ruanyifeng.com/,收益良多。

一、let命令
1、概念:let命令用于声明变量,和var类似,但是使用let命令所声明的变量只有在该变量所在的代码块内生效。
2、使用:适用于for循环的变量声明。

for (let i = 0;i < 10;i++) {
  let i = "a";
}
// for循环里面的两个i是不同的,并且属于不同的作用域。第一个i属于是for循环的循环变量的父作用域,第二个i属于是for循环的循环体的一个单独的子作用域。
console.log(i); // ReferenceError: i is not defined

3、与ES5的区别:
(1)ES6中的let命令不存在变量提升的问题。ES5中变量可以在声明之前使用,值为undefined。

// ES5:
console.log(example); // undefined
var example = "hello world"; // ES6:
console.log(example); // ReferenceError: example is not defined
let example = "hello world";

(2)暂时性死区。在代码块中,使用let命令所声明的变量在声明之前都是不可用的。在语法上,称为“暂时性死区”(temporal dead zone)TDZ。

{
// 死区开始 -> 代码块的开始
console.log(temp);
let temp = ""; // 死区结束 -> 使用let变量声明了temp
}

(3)不允许重复声明。

function fun1() {
  let a = "1";
  var a = "2";
} fun1(); // Identifier 'a' has already been declared function fun2() {
  let a = "1";
  let a = "2";
} fun2(); // Identifier 'a' has already been declared

二、块级作用域
1、为什么需要块级作用域?
(1)内层变量可能会覆盖外层变量。
(2)用来计数的循环变量泄露为全局变量。

var date = new Date();

function f() {
  console.log(date);
  if (false) {
    var date = "hello world";
  }
}
// if代码块的外部使用内层的date变量,内部使用内层的date变量。但是,函数f执行后,输出结果为undefined,原因在于变量提升,导致内层的date变量覆盖了外层的date变量。
f(); // undefined // 用来计数的循环变量泄露为全局变量
var str = 'hello world';
for (var i = 0;i < str.length;i++) {
  // ...
}
// console.log(i); // 5

let命令和块级作用域的更多相关文章

  1. ECMAScript6 入门教程 初学记录let命令 块级作用域

    一.基本语法-let命令 (1)ES6新增了let命令,用来声明变量.所声明的变量,只在let命令所在的代码块内有效. 循环的计数器,就很合适使用let命令.计数器i只在for循环体内有效,在循环体外 ...

  2. ES6标准入门 第二章:块级作用域 以及 let和const命令

    一.块级作用域 1.为什么需要块级作用域? ES5中只有全局作用域和函数作用域,带来很多不合理的场景. (1)内层变量可能会覆盖外层变量: var tem = new Date(); function ...

  3. ES6(块级作用域)

    我们都知道在javascript里是没有块级作用域的,而ES6添加了块级作用域,块级作用域能带来什么好处呢?为什么会添加这个功能呢?那就得了解ES5没有块级作用域时出现了哪些问题. ES5在没有块级作 ...

  4. ES6之块级作用域

    一.前言 在ECMAScript6(以下简称ES6)之前,ECMAScript的作用域只有两种: 1.  全局作用域: 2.  函数作用域. 正是因为有这两种作用域,所以在JavaScript中出现一 ...

  5. ES6 - Note1:块级作用域与常量

    在ES6以前,ES不支持块级作用域,只有全局作用域和函数作用域,所有变量的声明都存在变量声明提升. 1.let 关键字 声明一个块级变量,只在一个代码块中有效,如果在块外面访问便会报错,如下所示: { ...

  6. ES6 浅谈let与const 块级作用域之封闭空间(闭包)

    ES6新增了 let const 命令,用来声明变量.它的用法类似于 var  ,但是所声明的变量,只在 let const 命令所在的代码块内有效.  var const 不允许重复声明 用处: 可 ...

  7. ES6的 let const 以及块级作用域

    let声明变量 用法类似于var,但是所声明的变量只在let所在的代码块内有效. 1 . 在ES6环境下,let声明的变量不能在声明之前调用. 例: console.log(i); //会报错,这叫做 ...

  8. ES6-let、const和块级作用域

    1.介绍 总的来说,ES6是在ES2015的基础上改变了一些书写方式,开放了更多API,这样做的目的最终还是为了贴合实际开发的需要.如果说一门编程语言的诞生是天才的构思和实现,那它的发展无疑就是不断填 ...

  9. 闭包和let块级作用域

    还是先从一个题目开始: 写一个隔1s输出数组的一项的函数. 如果可以用ES6语法,则可以这么写: function print (arr) { for (let i = 0; i < arr.l ...

随机推荐

  1. January 25th, 2018 Week 04th Thursday

    What made something precious? Losing it and finding it. 一件东西怎样才会变得珍贵无比?先弄丢了它,然后又找到了. A short time ag ...

  2. Python用户名密码登录系统(MD5加密并存入文件,三次输入错误将被锁定)及对字符串进行凯撒密码加解密操作

    # -*- coding: gb2312 -*- #用户名密码登录系统(MD5加密并存入文件)及对字符串进行凯撒密码加解密操作 #作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.co ...

  3. NetCore开源项目集合

    具体见:https://github.com/thangchung/awesome-dotnet-core 半年前看到的,今天又看到了,记录下. 框架类: ZKWeb ABP General ASP. ...

  4. WPF防止重复运行实例

    1.方法一 在app.xaml.cs下添加如下代码: /// <summary> /// App.xaml 的交互逻辑 /// </summary> public partia ...

  5. WPFのclipToBounds与maskToBounds的区别

    UIView.clipsToBounds : 让子 View 只显示父 View 的 Frame 部分,子视图超出frame的部分不显示,默认为NO,设置为YES就会把超出的部分裁掉: maskToB ...

  6. c++引用lib和dll的方法总结

    C++ 调用.lib的方法: 一: 隐式的加载时链接,有三种方法 1  LIB文件直接加入到工程文件列表中 在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中"Add F ...

  7. sql中的exists用法

    查询选修语文(cno=21)的学生名单 SELECT sname FROM student WHERE EXISTS ( SELECT FROM sc WHERE sc.cno = AND sc.sn ...

  8. typeof与instanceof的区别是什么?

    在javascript中,判断一个变量的类型可以用typeof (1) 数字类型.typeof返回的值是number.比如说:typeof(1),返回值是number (2) 字符串类型,typeof ...

  9. centos7安装python3和pip3

    python3安装 1.安装准备 # 创建安装目录 mkdir /usr/local/python3 #下载python3 wget --no-check-certificate https://ww ...

  10. sparse 稀疏函数的用法2

    sparse函数 功能:Create sparse matrix-创建稀疏矩阵 用法1:S=sparse(X)——将矩阵X转化为稀疏矩阵的形式,即矩阵X中任何零元素去除,非零元素及其下标(索引)组成矩 ...