題記:之前在10月份的時候寫過阮大神的es6的第一章,但是由於那段時間專案組的動盪,所以也沒有什麼後續,導致我現在對es6基本都忘的差不多了,不過,現在換了新公司,最近也沒什麼任務,所以現在開始重新寫點東西;
第一章 關於let和const的命令;
let 有點類似於var ,主要也是用來宣告變數的。但是不一樣的地方在於,let所宣告的變數只在它所在的**塊內有效,在其他地方再次用let定義相同的變數是可以繼續正常執行的;
呼叫b時,則返回2;
這就表明了,let宣告的變數只在他當前的**塊內有效;
這個好處,在for迴圈的計數器內,就非常的有效;
這段**顯示,計數器i只在for迴圈體內有效,在迴圈體外引用就會報錯。
也就是在迴圈計數裡和大括號裡i是有效的,在外面就會報錯;
for(let i = 0;i<3;i++)這個時候i 是返回出3個abc;
for迴圈設定迴圈變數的部分是父作用域,而迴圈體內部是乙個單獨的子作用域;
所以**會正確執行,輸出三次abc;
這就表明let在不同的**塊可以使用相同的字母來定義變數,切互補影響;同時也表明let生命的變數只在它當前的**塊內有效
這就得說到var 了,會用js的人都知道,var 的命令會發生「變數提公升」的現象;就是說變數可以在宣告前使用,但是值為undefined;
這種現象其實看起來是真的很怪,也有很多面試題會出這個,導致很多小夥伴面對這個的時候遇到了很多的坑;
為了糾正這個現象;let命令改變了語法行為,它所宣告的變數一定要在宣告之後使用,否則就會報錯;、
//var 的情況
console.log(a);
var a = 1;
//let 的情況
在控制台輸出的結果中,變數a用var命令宣告,會發生變數提公升,即指令碼開始執行時,變數a已經存在了,但是沒有值
,所以輸出undefined。而變數bar是用的let宣告,不會發生變數提公升這個現象。這就表示宣告bar之前,bar這兒額個變數是不存在的,從而報錯。
只要在塊級作用域內存在let或者const命令,它所宣告的變數就「繫結」binding這個區域,不再受到外部影響;
先是定義了全域性變數tmp,但是在塊級作用域內let又宣告了乙個區域性變數tmp,導致後者繫結在這個塊級作用域內,所以let宣告了乙個區域性變數tmp,導致後者繫結這個塊級作用域,所以在let宣告變數前,對tmp賦值是會報錯的;
但是如果你用let定義的不是tmp.則tmp沒有繫結在這個塊級作用域內,從而不會報錯,像我上面的例子1;
es6明確規定,如果區塊中存在let和const命令,這個區塊對這個命令宣告的的變數,從一開始就形成了封閉作用域。凡是在宣告之前就是用這些變數的,就會報錯;
總之,在**塊內,用let命令宣告變數之前,該變數都是不可用的。這在語法上,稱為「暫時性死區」(temporal dead zone,簡稱tdz).
這段**中,在let tmp上面就稱為變數的tmp暫時性死區,所以直接報錯。
暫時性的死區導致了typeof不再是乙個百分之百安全的操作。
這段**中,變數x使用let命令宣告,所以在宣告之前,都是屬於x的死區;只要在let之前使用該變數就會報錯。
而乙個變數無論是用var 宣告還是不宣告,使用typeof都不會報錯;
所以,在沒有let命令之前,typeof是百分之百安全的,永遠不會報錯。現在有了let就不成立了,所以變數一定要在let宣告之後使用,否則一定會報錯;
es6 規定暫時性死區和
let
、const
語句不出現變數提公升,主要是為了減少執行時錯誤,防止在變數宣告前就使用這個變數,從而導致意料之外的行為。這樣的錯誤在 es5 是很常見的,現在有了這種規定,避免此類錯誤就很容易了。總之,暫時性死區的本質就是,只要一進入當前作用域,所要使用的變數就已經存在了,但是不可獲取,只有等到宣告變數的那一行**出現,才可以獲取和使用該變數。
let
不允許在相同作用域內,重複宣告同乙個變數。function因此,不能在函式內部重新宣告引數。()//
報錯function
()//
報錯
function已經有了變數arg卻又重新定義arg所以報錯;(arg)
//報錯;
function
(arg)}//
不報錯
而下面是因為在{}內,在這個範圍內屬於let當前的作用域,所以不會報錯;
es5只有全域性作用域和函式作用域,沒有塊級作用域,這就導致很多場景不合理;
1)內層變數可能會覆蓋外層的變數;
var tmp= new**的原意是,date();
function
f()
}f()
if
**塊的外部使用外層的tmp
變數,內部使用內層的tmp
變數。但是,函式f
執行後,輸出結果為undefined
,原因在於變數提公升,導致內層的tmp
變數覆蓋了外層的tmp
變數。2) 用來計數的迴圈變數洩露為全域性變數;
var a = "hello";最後console.log(i)輸出的是5,這就表明原本i是用來迴圈的,卻在迴圈結束後,並沒有消失,成為了全域性變數,也就是洩露了;for(var i =0;i)
console.log(i);
let 實際上為js新增了塊級作用域。
function上面的函式有兩個**塊,都宣告了變數f1()
console.log(n);
}f1();
n
,執行後輸出 5。這表示外層**塊不受內層**塊的影響。如果兩次都使用var
定義變數n
,最後輸出的值才是 10。/////////先到這吧,吃飯去了
ES6標準入門 6 陣列的擴充套件
擴充套件運算子 spread 例子1 es5 的寫法 function f x,y,z let args 0,1,2 es6 的寫法 f args 例子2 es5 的寫法 let arr1 0,1,2 let arr2 3,4,5 es6 的寫法 arr1.push arr2 與解構賦值結合 函式的...
《ES6標準入門》(一)let和const
一 let命令 1 let的作用域只在 塊內,塊外無效 var全域性有效 var a for var i 0 i 10 i a 6 對於這段 變數i是var宣告的,在全域性範圍內有效,所以每一次迴圈,新的i值都會覆蓋舊值,導致最後輸出的是最後一輪的i值 如果使用let,宣告的變數僅在塊級作用域內有效...
阮一峰老師的《ES6標準入門》塊級作用域與函式宣告
在學習阮一峰老師的 es6標準入門 塊級作用域與函式宣告部分時,有一部分理解不通 瀏覽器的 es6 環境 function f function f uncaught typeerror f is not a function上面的例子實際執行的 如下。瀏覽器的 es6 環境 function f ...