關於阮大神的es6標準入門第一章

2022-07-25 12:24:13 字數 4145 閱讀 7809

題記:之前在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 規定暫時性死區和letconst語句不出現變數提公升,主要是為了減少執行時錯誤,防止在變數宣告前就使用這個變數,從而導致意料之外的行為。這樣的錯誤在 es5 是很常見的,現在有了這種規定,避免此類錯誤就很容易了。

總之,暫時性死區的本質就是,只要一進入當前作用域,所要使用的變數就已經存在了,但是不可獲取,只有等到宣告變數的那一行**出現,才可以獲取和使用該變數。

let不允許在相同作用域內,重複宣告同乙個變數。

function

()//

報錯function

()//

報錯

因此,不能在函式內部重新宣告引數。

function

(arg)

//報錯;

function

(arg)}//

不報錯

已經有了變數arg卻又重新定義arg所以報錯;

而下面是因為在{}內,在這個範圍內屬於let當前的作用域,所以不會報錯;

es5只有全域性作用域和函式作用域,沒有塊級作用域,這就導致很多場景不合理;

1)內層變數可能會覆蓋外層的變數;

var tmp= new

date();

function

f()

}f()

**的原意是,if**塊的外部使用外層的tmp變數,內部使用內層的tmp變數。但是,函式f執行後,輸出結果為undefined,原因在於變數提公升,導致內層的tmp變數覆蓋了外層的tmp變數。

2) 用來計數的迴圈變數洩露為全域性變數;

var a = "hello";

for(var i =0;i)

console.log(i);

最後console.log(i)輸出的是5,這就表明原本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 ...