【小記】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命令聲明變量以前,該變量都是不可用的
相關文章
相關標籤/搜索