較之前es5,新版本在宣告上有改變,現根據文件教程,總結下不同之處,時長溫習。
let只在命令所在的**塊 {} 裡有效
es5只有全域性作用域和函式作用域,沒有塊級作用域,帶來很多不合理的場景,比如:
第一種場景,內層變數可能會覆蓋外層變數。
var tmp = newdate();
function
f()
}f();
//undefined
上面**的原意是,if
**塊的外部使用外層的tmp
變數,內部使用內層的tmp
變數。但是,函式f
執行後,輸出結果為undefined
,原因在於變數提公升,導致內層的tmp
變數覆蓋了外層的tmp
變數。
第二種場景,用來計數的迴圈變數洩露為全域性變數。
var s = 'hello';for (var i = 0; i < s.length; i++)
console.log(i);
//5
上面**中,變數es6明確規定,如果區塊中存在i
只用來控制迴圈,但是迴圈結束後,它並沒有消失,洩露成了全域性變數。es6的塊級作用域可以多個巢狀,外層作用域無法訪問內層作用域,內層作用域可以宣告外層作用域的引數。
另外,es6標準也執行在塊級作用域下宣告函式,而作用域外不可以引用,函式宣告是類似於var還是let,歌瀏覽器可能有自己的處理方式,
所以暫時不建議在塊級作用域下宣告函式
塊級作用域是乙個語句,裡面封裝了若干語句,沒有返回值,現在有乙個提案,使得塊級作用域可以變為表示式,也就是說可以返回值,
辦法就是在塊級作用域之前加上
do
,使它變為do
表示式。
let
和const
命令,這個區塊對這些命令宣告的變數,從一開始就形成了封閉作用域。凡是在宣告之前就使用這些變數,就會報錯。
總之,在**塊內,使用let
命令宣告變數之前,該變數都是不可用的。這在語法上,稱為「暫時性死區」(temporal dead zone,簡稱 tdz)。
es6 規定暫時性死區和let
、const
語句不出現變數提公升,主要是為了減少執行時錯誤,防止在變數宣告前就使用這個變數,從而導致意料之外的行為。這樣的錯誤在 es5 是很常見的,現在有了這種規定,避免此類錯誤就很容易了。
總之,暫時性死區的本質就是,只要一進入當前作用域,所要使用的變數就已經存在了,但是不可獲取,只有等到宣告變數的那一行**出現,才可以獲取和使用該變數。
注意:不能在函式裡重複宣告引數,會報錯
es5沒有常量的概念,es6新增常量
const 命令宣告乙個唯讀的常量,一旦宣告,值不可以改變,改變會報錯;只宣告不賦值也會報錯。
作用域與let 相同,只在所在塊級作用域內有效,其他的特性也相同
本質上,const 實際上保證的並不是變數的值不可以改動,而是變數指向的那個記憶體位址不可以改動,
對於簡單型別的資料(數值、字串、布林值),值就儲存在變數指向的那個記憶體位址,因此等同於常量。
但對於復合型別的資料(主要是物件和陣列),變數指向的記憶體位址,儲存的只是乙個指標,const
只能保證這個指標是固定的,至於它指向的資料結構是不是可變的,就完全不能控制了。因此,將乙個物件宣告為常量必須非常小心。
(es5只有 var 和function 函式宣告兩種方式)
inport、class 方式的宣告留坑,待填。
以上內容參照阮一峰老師的《ecmascript 6 入門》,會不定期更新;
es6的常量的宣告
在 es6 中里也可以使用 const 語法進行宣告。使用 const 宣告的變數會被認為是常量 constant 意味著它們的值在被設定完成後就不能再被改變。正因為如此,所有的 const 變數都需要在宣告時進行初始化,示例如下 有效的常量 const maxitems 30 語法錯誤 未進行初始...
ES6常量宣告方式 const
今天就來聊聊es6常量的宣告方式。在es5中定義乙個常量 object.defineproperty window,pi console.log pi 5console.log pi 在es6中定義乙個常量 典型報錯 const a 5a 6 報錯,常量不可以改變 const b 報錯,常量必須賦初...
Es6之變數宣告
es6變數宣告let 和 canst,let 所宣告的變數具有塊級作用域,且宣告的變數不會前置,而const宣告的是不變了常量 let test test let 所宣告的變數只在塊級作用域內有效,而var就不同 for var i 1 i 5 i console.log str 輸出hello.c...