基本用法
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頁面。維基百科 使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,建立乙個鏈結等,詳細...