一、let和const命令
1.1不存在變數提公升和暫時性死區(tdz)
//tdz開始
tmp = 'abc' //referenceerror
console.log(tmp) //referenceerror
let tmp; //tdz結束
console.log(tmp) //undefined
tmp = 123;
console.log(tmp) //123
暫時性死區意味著type of不再是百分之百安全
typeof x; //referenceerror
let x;
1.2隱蔽死區function bar (x=y,y=2)
bar() //referenceerror
1.3塊級作用域
1.3.1 第一種場景,內層變數可能會覆蓋外層變數
var tmp = new date();
function f()
}f(); // undefined
if**塊的外部使用外層的tmp變數,內部使用內層的tmp變數。
但是,函式f執行後,輸出結果為undefined,原因在於變數提公升,
導致內層的tmp變數覆蓋了外層的tmp變數。
1.3.2 第二種場景,用來計數的迴圈變數洩露為全域性變數
var s = 'hello';
for (var i = 0; i < s.length; i++)
console.log(i); // 5
變數i只用來控制迴圈,但是迴圈結束後,它並沒有消失,洩露成了全域性變數。
1.3.3 塊級作用域必須有大括號
// 第一種寫法,報錯
if (true) let x = 1;
// 第二種寫法,不報錯
if (true)
// 不報錯
'use strict';
if (true)
}// 報錯
'use strict';
if (true)
function f() {}
1.4 const
const宣告乙個唯讀的常量,一旦宣告,值不能改變。
如果真的想將物件凍結,使用object.freeze方法
const foo = object.freeze({});
// 常規模式時,下面一行不起作用;
// 嚴格模式時,該行會報錯
foo.prop = 123;
1.5頂層物件的屬性
頂層物件,在瀏覽器環境指的是window物件,在 node 指的是global物件。es5 之中,頂層物件的屬性與全域性變數是等價的。
es6 為了改變這一點,一方面規定,為了保持相容性,var命令和function命令宣告的全域性變數,依舊是頂層物件的屬性;另一方面規定,let命令、const命令、class命令宣告的全域性變數,不屬於頂層物件的屬性。也就是說,從 es6 開始,全域性變數將逐步與頂層物件的屬性脫鉤。
var a = 1;
// 如果在 node 的 repl 環境,可以寫成 global.a
// 或者採用通用方法,寫成 this.a
window.a // 1
let b = 1;
window.b // undefined
ES6 一 let和const命令
在js中是沒有塊級作用域的,var 宣告的變數作用域是整個函式體,而let可以起到這一作用 console.log b 2 console.log a a is not defind 而let可以起到這一作用啊在js中變數和函式的宣告會提公升到當前作用域最頂部執行。這樣就會出現問題。var a 函式...
ES6學習筆記之《let 和 const》
es6宣告變數的方法 var function let const import class let和 const const的作用域與let命令相同 只在宣告所在的塊級作用域內有效。if true max uncaught referenceerror max is not defined con...
ES6之let和const命令(筆記)
1 let命令 console.log a undefined console.log b 112 const命令 3 設定跨模組常量模組 export consta 1 import as constant from constants console.log constant.a import ...