ES6學習 let和const命令

2021-09-22 14:06:17 字數 3082 閱讀 5507

說明:本文參考阮一峰的ecmascript 6 入門

console.log(a )

**塊外使用會報錯: referenceerror: a is not defined

for迴圈內使用let和var產生的不同效果:

下面**使用的是var,結果為10

var a = 

for (var i = 0; i < 10; i++)

}a[9]() //10

上述**,因為變數i是var宣告的,在全域性範圍內都有效,所以全域性只有乙個變數i。這就導致for循壞結束後i的值為10,而當我們再去呼叫a陣列裡面的函式,函式裡面i的值即為i最終值10。

下面的**使用的是let,宣告的變數僅在塊級作用域內有效,最後結果為9

var a = 

for (let i=0; i < 10; i++)

}a[9]()//9

上述**,因為變數i是let宣告的,在塊級作用域內有效,就會導致for迴圈的每一輪迴圈都會有自己宣告的變數i,可以理解為每輪迴圈都是在做以下的工作,只不過各自的i值不同

當i=0時

}

當i=1時

}

等等…

當i=9時

}

當呼叫陣列裡的函式,例如a[9](),因為i在自己所宣告的**塊內有效,而函式和其同在乙個**塊內,自然先找到自己所在**塊內的i,所以a[9]()輸出的值為9。

var命令會發生「變數提公升」現象,即變數可以在宣告之前使用,值為undefined

// var 的情況

console.log(a) // 輸出undefined

var a = 10

// let 的情況

console.log(b) // 報錯referenceerror

let b = 10

只要塊級作用域存在let宣告的變數,那麼這個變數就不再受外部影響

var temp = "abc"

if (true)

上面**中,存在全域性變數temp,if語句的**塊內也使用了let宣告的temp並且是在賦值temp之後宣告的,但最終報錯是因為塊級作用域內存在let宣告的temp變數,使得該變數繫結在塊級作用域內,不會去尋找全域性變數temp,而在let宣告之前就使用該變數就會報錯。

let命令不允許在相同作用域內,重複宣告同乙個變數,以下**會報錯

// 報錯

function func()

// 報錯

function func()

es5只有全域性作用域和函式作用域,沒有塊級作用域,這會導致存在許多不合理場景。

例如記憶體變數覆蓋了外層變數,for循壞的迴圈變數成為了全域性作用域,迴圈結束後該迴圈變數依然存在不能被**。

而es6的let命令實際上就構成了塊級作用域。並且在es6中規定允許在塊級作用域中宣告函式。

const pi = 3.1415;

pi // 3.1415

pi = 3;

// typeerror: assignment to constant variable.

上面**在試圖改變常量pi但報了錯

既然const宣告的變數不能進行改變,那麼就需要在宣告的時候進行初始化,不能留到以後再進行賦值。

const foo;

// syntaxerror: missing initializer in const declaration

上面**說明const宣告變數時要進行初始化否則會報錯

const的作用域同let一樣,只在宣告所在的塊級作用域內有效,const宣告的變數同let一樣不能重複宣告

if (true) 

max // uncaught referenceerror: max is not defined

//const宣告的變數同let一樣不能重複宣告

var msg= "hello!";

let age = 19;

// 以下兩行都會報錯

const msg= "goodbye!";

const age = 25;

const實際上是讓變數指向的記憶體位址儲存的資料不能改變,並不是變數的值不能改動。對於簡單型別(數值、字串、布林值)來說,值就儲存在變數指向的那個記憶體位址中,因此等同於常量。對於複雜型別(主要是物件和陣列)來說,變數指向的記憶體位址儲存著指向實際資料的指標,const只能保證這個指標是固定的,至於它指向的實際資料是否可變,則不受控制。因此在將乙個物件宣告為常量值時,這個物件自身是可以改變的。

const person = {}

person.name = "王五"

person.name //王五

person = {} // typeerror: "person" is read-only

上面**person是乙個常量物件,可以成功為其新增屬性name,但不能讓person重新指向另乙個位址。

頂層物件,在瀏覽器中是指window物件,在node中指global物件。在es5中頂層物件的屬性與全域性變數是等價的。

window.a = 1;

a // 1

a = 2;

window.a // 2

上面**中,頂層物件的屬性賦值與全域性變數的賦值,是同一件事。

es6中則規定,var命令和function命令宣告的全域性變數依舊是頂層物件的屬性,而let、const、class命令宣告的全域性變數不屬於頂層物件的屬性。

let a = 6

console.log(window.a) //undeined

上面**中,全域性變數a由let命令宣告,所以它不是頂層物件的屬性,返回undefined

ES6學習 let和const命令

1.let命令 所宣告的變數命令所在 塊有效 a referenceerror a is not defined.b 1for迴圈的計數器,就很適合let命令 for let i 0 i arr.length i console.log i referenceerror i is not defin...

es6學習筆記 let和const

console.log b uncaught referenceerror a is not defined 在for迴圈中,迴圈語句部分是乙個作用域,內部又是乙個作用域 for let a 1 a 3 a 在let宣告變數完成前,對變數賦值會出錯es中模仿塊級作用域 function functi...

ES6學習 let和const命令

es5只有兩種宣告變數的方法 var命令和function命令。es6新增了let命令和const命令宣告變數。let命令用來宣告變數,宣告的變數只能在let命令所在的 塊中有效。類似於var命令,var命令宣告的變數在全域性範圍內有效。const命令宣告乙個唯讀的常量,宣告時必須賦值,否則會報錯。...