中午偷個閒作個es6let的使用總結es6
{ let a= 10; { let a= 20; console.log('子做用域', a);// 20 } console.log('父做用域', a);// 10 }
// 例子一 { let a= 10; var b= 20; } console.log(a) // ReferenceError: a is not defined.會報引用錯誤 console.log(b) // 20 //例子二 // 使用var聲明,則會提高爲外層變量,次例子中的i提高爲外層變量,也就是提高到上一個執行上下文 var a = []; for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 循環執行完後,i被賦值爲10,因此最終結果爲10 // 使用let申明i,當前的i只在本輪循環有效,因此每一次循環的i其實都是一個新的變量,因此最後輸出的是6 // for循環還有一個特別之處,就是設置循環變量的那部分是一個父做用域,而循環體內部是一個單獨的子做用域 var a = []; for (let i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 6
'use strict'; { if (true) // 報錯 function func() { } }
{ let a= 10; { // 在該做用域裏面,a尚未聲明完成 console.log(a); // ReferenceError: a is not defined let a= 20; // 若是這裏不聲明就不會報錯,則a引用的是父做用域的a console.log(a); // 20 } }
// 報語法錯誤 { let a= 10; let a= 20; } // 因此不能在函數內部從新聲明參數 function func(arg) { let arg= 20; }
var a= 10; function func(){ console.log(a); // undefined if(false) { var a= 20; // 在該執行上下文裏,'變量對像'建立的過程當中會作變量提高,肯定做用域鏈,因此console時輸出的是內部這個a,並不會改變外層的a,至關於從新申明瞭一個變量a,指向不一樣於外層a變量的棧內存的地址,也因爲不一樣的執行上下文,不一樣的變量對像 } } func() console.log('外層a',a) // 10