ES6筆記(2) let的塊級作用域

2022-02-02 00:14:34 字數 2346 閱讀 8684

系列文章 --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.塊級作用域用於宣告在指定塊的...