es6中let和const 塊級作用域

2021-10-24 04:45:35 字數 1470 閱讀 5114

在es6之前,我們都是用 var 關鍵字宣告變數。無論宣告在何處,都會被視為宣告在函式的最頂部(不在函式內即在全域性作用域的最頂部)。這就是函式變數提公升 例如:

functionaa(

)else

}

變數宣告後**實際上是:

functionaa(

)else

//此處訪問 test 值為 undefined

}

所以不用關心 flag 是否為 true or false。實際上,無論如何 test 都會被建立宣告。

接下來es6主角登場:

我們通常用 let 和 const 來宣告,let 表示變數、const 表示常量。let 和 const 都是塊級作用域。怎麼理解這個塊級作用域?

在乙個函式內部

在乙個**塊內部

只要在 {}花括號內 的**塊即可以認為 let 和 const 的作用域。

functionaa(

)else

}

et 的作用域是在它所在當前**塊,但不會被提公升到當前函式的最頂部。

再來說說 const

const 宣告的變數必須提供乙個值,而且會被認為是常量,意思就是它的值被設定完成後就不能再修改了。

const name =

'cc'

name =

'yy'

// 再次賦值此時會報錯

還有,如果 const 的是乙個物件,物件所包含的值是可以被修改的。抽象一點兒說,就是物件所指向的位址不能改變,而變數成員是可以修改的。

看以下例子就非常清楚:

const student =

student.name =

'yy'

// 修改變數成員,一點兒毛病沒有

student =

// 修改變數繫結,這樣子就會報錯了

letconst命令,這個區塊對這些命令宣告的變數,從一開始就形成了封閉作用域。凡是在宣告之前就使用這些變數,就會報錯。

總之,在**塊內,使用let命令宣告變數之前,該變數都是不可用的。這在語法上,稱為「暫時性死區」(temporal dead zone,簡稱tdz)。

if

(true

)bar()

;// 報錯

上面**中,呼叫bar函式之所以報錯(某些實現可能不報錯),是因為引數x預設值等於另乙個引數y,而此時y還沒有宣告,屬於」死區「。如果y的預設值是x,就不會報錯,因為此時x已經宣告了。

function

bar(x =

2, y = x)

bar();

// [2, 2]

ES6中let和const命令

es6中新增了 let 命令,用於宣告變數,關於let有以下幾個特點 1 用法類似於var,但是所宣告的變數只在 let 命令所在的 塊內有效,實現了塊級作用域且不會汙染全域性變數。2 不存在變數提公升 3 暫時性死區 4 同乙個變數在相同作用域內不允許重複宣告 下面圍繞這四個特點進行詳細的分析 l...

ES6中let和const詳解

let和var一樣也是用來定義變數,不同之處在於let是塊級作用域,只在所定義的塊級作用域中生效,乙個花括號便是乙個塊級作用域 console.log a 我是var定義的 console.log b b is not defined 可以看出let定義的變數在全域性作用域內並沒有生效 如果我們在全...

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...