【小记】ES6

前言

来自阅读阮老师的《ES6入门》的小结+疑问~先开个坑,慢慢填es6

问题

Q:let和for循环?
先看书中的一段代码:闭包

var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 10

这个咱们知道,是由于每一个a[i]都被赋予了一个函数,输出做用域的i,而a[6]()是在全局做用域下调用的,因此输出的i是全局变量i,由于for循环没有块做用域,因此输出10。
改为let后:函数

var a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 6

其实我第一次看到这里是不能理解的,而后看到书上说:工具

变量i是let声明的,当前的i只在本轮循环有效,因此每一次循环的i其实都是一个新的变量,因此最后输出的是6。

好吧,仍是感受没清楚到底这个机制是啥样的(⊙﹏⊙),那我就用小工具把它转为ES5语法了(虽然也不能当成彻底等同吧(lll¬ω¬)):oop

"use strict";
var a = [];

var _loop = function _loop(i) {
  a[i] = function () {
    console.log(i);
  };
};

for (var i = 0; i < 10; i++) {
  _loop(i);
}
a[6](); // 6

这个结果就很清楚啦,它相似在执行语句的外面包裹了一个函数,结果就是i当成参数传进去了,并且还造成了一个闭包:
图片描述spa

再来看另外一个例子:code

for (let i = 0; i < 3; i++) {
  let i = 'abc';
  console.log(i);
}
// abc
// abc
// abc

原文说:blog

for循环还有一个特别之处,就是设置循环变量的那部分是一个父做用域,而循环体内部是一个单独的子做用域。

转换以后的结果(这里有小问题0_0,单纯转换出来会都是i,可是多复制一份,转出来就是下面这种,我我的以为根据意思应该转成这样才是对的):图片

for (var _i = 0; _i < 3; _i++) {
  var _i2 = 'abc';
  console.log(_i2);
}

Q:let特性?
不存在变量提高
暂时性死区(temporal dead zone)作用域

在代码块内,使用let命令声明变量以前,该变量都是不可用的
相关文章
相关标签/搜索