ES6 let 和 const命令(學習筆記)

2021-10-06 02:44:43 字數 1822 閱讀 6295

1.暫時性死區:只要塊級作用域內有 let 命令,它所宣告的變數就繫結(bounding)這個區域,不再受外部的影響。也就是說在**塊內使用 let 命令宣告變數之前,該變數都是不可用的,在語法上,這被稱為「暫時性死區」。

var tmp = 123;

if(true)

es6明確規定,如果區塊中存在 let 和 const 命令,這個區塊對這些命令宣告的變數,從一開始就形成了封閉作用域,凡是在宣告之前使用這些變數就會報錯。

2.不允許在同乙個作用域內重複宣告同乙個變數,否則會報錯。

3.塊級作用域與函式宣告:在es5中明確規定,函式不能只能在頂級作用域或函式作用域中宣告。但es6 中引入了塊級作用域之後,明確允許函式可以在塊級作用域中宣告,函式宣告語句的行為類似 let 語句,在塊級作用域之外不可引用。

function f()

(function()

}f();

}());

在 es5 中,會得到 「i'm inside」,但在 es6中會報錯,這是因為改變了塊級作用域內宣告的函式的處理規則,會對老**產生影響。為了減輕因此產生的不相容問題,es6 規定,瀏覽器的實現可以不遵守上面的規定,有自己的行為方式

(1)允許在塊級作用域內宣告函式。

(2)函式宣告類似於 var ,即會提公升到全域性作用域或函式作用域頭部。

(3)同時,函式宣告還會提公升到所在的塊級作用域的頭部。

考慮到環境導致的行為差異改變太大,應該避免在塊級作用域內宣告函式。如果確實需要,也可以寫成函式表示式,而不是函式宣告語句。

//塊級作用域宣告函式,不建議使用

}//塊級作用域內,優先使用函式表示式

;}

4.const宣告的變數資料型別簡若是簡單資料型別數值,字串,布林型別)的值,則值不得改變,所以在宣告的時候必須賦值,否則會報錯。其實是因為變數指向的記憶體位址無法改變。但若是用 const 來宣告復合型別的資料(主要是物件和陣列),變數指向的記憶體位址,儲存的只是乙個指向實際資料的指標,const 只能保證這個指標是固定的(即總是指向乙個固定的指標),至於它指向的資料結構是不是可變的,就完全不能控制了。因此,將乙個物件宣告為常量必須小心。

//例1

const a;

console.log(a); //報錯

//例2

const obj = {};

obj.a = 123; //為 obj 新增乙個屬性可以成功

obj = {}; //將 obj 指向另乙個物件會報錯

//例3

const a = ;

a.push("hello"); //可執行

a.length = 0; //可執行

a = ["world"]; //會報錯

若想將物件凍結,可以使用 object.freeze(),除了將物件凍結,物件的屬性也應該凍結。

const obj = object.freeze({});

obj.a = 123; //這行語句在正常模式下不會起什麼作用,但在嚴格模式下會報錯

學習筆記 Es6 let和const

console.log insane 報錯 上面 使用了乙個五層的塊級作用域,每一層都是乙個單獨的作用域。第四層作用域無法讀取第五層作用域的內部變數。但內層作用域可以定義外層作用域的同名變數。如下 2 塊級作用域的出現,實際上使得獲得廣泛應用的匿名立即執行函式表示式 匿名 iife 不再必要了。ii...

ES6 let與const,解構賦值

ecma script2015以後的 沒有塊級作用域,導致var在for if內宣告的變數可以被全域性訪問 es6之前的解決辦法使用iife 立即執行函式 變數提公升,使 不好理解。舉例 var a 1 function show show 結果是a undefined 複製 let宣告的變數有塊級...

ES6 let變數宣告

var 宣告的變數在window上 用let或者const去宣告變數,這個變數不會被放到window上 array.foreach function currentvalue,index,arr thisvalue 如果瀏覽器對let已經支援了,其實絕大部分情況下var都可以被替換成let,以後盡量...