系列文章 --es6筆記系列
我們都知道,在es6以前,js只有函式級作用域,沒有塊級作用域這個概念
沒有塊級作用域,有利有弊,利於方便自由,弊於作用域內的變數容易被共享,例如這個例子
var a =;for (var i = 1; i <= 10; ++i) ;
}a[3]() //
11
迴圈中變數i是處於全域性作用域下的,其實這裡是個閉包,函式內部的i與函式外的i形成了引用的關係,導致函式退出之後i未被銷毀,引用的依然是全域性的i
迴圈完成,此時i已經是11,呼叫之,則值皆為11
這是沒有塊級作用域支援的經典例子,es6則引入了這個特性,通過let關鍵字,形成「塊級的作用域」
let和var類似,用來宣告變數,那麼,把上方中的var換成let
var a =;for (let i = 1; i <= 10; ++i) ;
}a[3]() //
3
這是正確的結果,因為let使for迴圈變成了乙個「塊級作用域」,類似的還有if、while的「塊級作用域」
if (1)console.log(a);
//undefined
console.log(b); //
11
1)不能重複宣告,var重複宣告會被覆蓋,但let重複宣告會報錯
var aa = 1;var aa = 2;
let bb = 1;
let bb = 2; //
uncaught syntaxerror: identifier 'bb' has already been declared
2)不存在變數提公升,如下做法會報錯
console.log(a2); //uncaught referenceerror: a2 is not defined
console.log(b); //
undefined
let a2 = 10;
var b = 11;
3) 存在暫時性死區(temporal dead zone),只要塊級作用域內存在let的宣告,它所宣告的變數就「繫結」(binding)這個區域,不再受外部的影響
var a3 = 3;if (1)
此外,不單是顯示的let才存在死區這種狀態,在函式的預設引數之中也會發生,如下的b未宣告則直接使用a = b會報錯
function bar(a = b, b = 2)bar();
//uncaught referenceerror: b is not defined
4)let與window物件脫鉤
一般來說,全域性var宣告的變數,會掛鉤在window物件上,但let卻不會這樣,如
var aa = 1;let bb = 1;
console.log(window.aa);
console.log(window.bb);
1)匿名函式
沒有塊級作用域之前,為了整合**,更好的分塊不予外部**混淆,我們常常使用匿名函式的自執行方式
(function() )();
但或許現在不再需要了,直接使用一對(或多對)大括號,就有了塊級的作用域
const宣告了乙個唯讀的常量,常量,即值不可更改。
const max = 10;max = 11; //
uncaught typeerror: assignment to constant variable.
const除了擁有let上述的特點之外,還有一些要注意的點
1)const一旦宣告變數,就必須立即初始化,否則報錯
const max; //uncaught syntaxerror: missing initializer in const declaration
2) const宣告的引用型別
const宣告的引用型別,只是引用型別的位址不能更改,但其指向的值是可以的,如
const obj =;obj.a = 11;
obj.a
//11
ES6初探 let與塊級作用域
很久沒有寫部落格,日子一天天過得很快,覺得有時候寫點東西會讓人沉靜下來邊思考邊整理,一直糾結let是個什麼東西,看了些面試題好多都關於這個的,今天終覺恍然大悟啊,然後整個人就開心起來了,終究學習還是使人快樂啊!進入正題吧 首先我們說一下塊級作用域的定義 任何一對花括號 和 中的語句集都屬於乙個塊,在...
es6中let和const 塊級作用域
在es6之前,我們都是用 var 關鍵字宣告變數。無論宣告在何處,都會被視為宣告在函式的最頂部 不在函式內即在全域性作用域的最頂部 這就是函式變數提公升 例如 functionaa else 變數宣告後 實際上是 functionaa else 此處訪問 test 值為 undefined 所以不用...
ES6的塊級作用域
為什麼要使用塊級作用域?1.在預編譯階段,變數的宣告會被提公升到作用域頂部,而初始化操作依舊留在原處執行,在該作用域中未定義變數的地方也能訪問到該變數,但是此時變數尚未初始化,所以其值為undefined,為此es6引入塊級作用域來強化對變數生命週期的控制 塊級宣告 1.塊級作用域用於宣告在指定塊的...