歡迎使用CSDN markdown編輯器

2021-07-23 16:56:26 字數 1793 閱讀 1530

基本用法

es6新增了let命令,用來宣告變數。它的用法類似於var,但是所宣告的變數,只在let命令所在的**塊內有效。以下是let和var的對比,在作用域外面引用 a會出錯,但引用b不會。

a // referenceerror: a is not defined.

b // 1

用例

下面**中,變數i是var宣告的,在全域性範圍內都有效。所以每一次迴圈,新的i值都會覆蓋舊值,導致最後輸出的是最後一輪的i的值。

var a = ;

for (var i = 0; i < 10; i++) ;

}a[6](); // 10

下面**中,變數i是let宣告的,當前的i只在本輪迴圈有效,所以每一次迴圈的i其實都是乙個新的變數,所以最後輸出的是6。

var a = ;

for (let i = 0; i < 10; i++) ;

}a[6](); // 6

不存在變數提公升

let不像var那樣會發生「變數提公升」現象。所以,變數一定要在宣告後使用,否則報錯。

console.log(foo); // 輸出undefined

console.log(bar); // 報錯referenceerror

var foo = 2;

let bar = 2;

暫時性死區

只要塊級作用域內存在let命令,它所宣告的變數就「繫結」(binding)這個區域,不再受外部的影響。

var tmp = 123;

if (true)

上面**中,存在全域性變數tmp,但是塊級作用域內let又宣告了乙個區域性變數tmp,導致後者繫結這個塊級作用域,所以在let宣告變數前,對tmp賦值會報錯。

總之,在**塊內,使用let命令宣告變數之前,該變數都是不可用的。這在語法上,稱為「暫時性死區」(temporal dead zone,簡稱tdz)。

if (true)
上面**中,在let命令宣告變數tmp之前,都屬於變數tmp的「死區」。

「暫時性死區」也意味著typeof不再是乙個百分之百安全的操作。如:

typeof x; // referenceerror

let x;

總之,暫時性死區的本質就是,只要一進入當前作用域,所要使用的變數就已經存在了,但是不可獲取,只有等到宣告變數的那一行**出現,才可以獲取和使用該變數。

不允許重複宣告

let不允許在相同作用域內,重複宣告同乙個變數

// 報錯

function ()

// 報錯

function ()

因此,不能在函式內部重新宣告引數。

function func(arg) 

function func(arg)

}

為什麼需要塊級作用域?

es5只有全域性作用域和函式作用域,沒有塊級作用域,這帶來很多不合理的場景

上面**中,函式f執行後,輸出結果為undefined,原因在於變數提公升,導致內層的tmp變數覆蓋了外層的tmp變數。

es6的塊級作用域

歡迎使用CSDN markdow

本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...

歡迎毛毛與妞妞使用CSDN markdown編輯器

建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...

歡迎使用CSDN markdow1n編輯器

本markdown編輯器使用stackedit修改而來,用它寫部落格,將會帶來全新的體驗哦 markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文字格式編寫文件,然後轉換成格式豐富的html頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...