來自閱讀阮老師的《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命令聲明變量以前,該變量都是不可用的