在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 =
// 修改變數繫結,這樣子就會報錯了
let
和const
命令,這個區塊對這些命令宣告的變數,從一開始就形成了封閉作用域。凡是在宣告之前就使用這些變數,就會報錯。
總之,在**塊內,使用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...