for(var i = 0; i < 10; i++){} console.log(i); //10 for(let j = 0; j < 10; j++){} console.log(j); //"ReferenceError: j is not defined
疑問: https://segmentfault.com/q/1010000004643248javascript
console.log(a); // 輸出undefined console.log(b); // 報錯ReferenceError console.log(c); // 報錯ReferenceError var a = 2; let b = 2;
注意區別undefined
和ReferenceError
java
只要進入當前塊級做用域,所使用的變量已經存在了,但在聲明以前都屬於死區,不可進行操做。segmentfault
注意: typeof
再也不是100%安全的操做安全
typeof x; // ReferenceError typeof y // undefined let x;
let x = 1; let x; // "SyntaxError: Identifier 'x' has already been declared var y = 2; var y = 3; // y = 3
// 匿名函數寫法 (function () { var tmp = ...; ... }()); // 塊級做用域寫法 { let tmp = ...; ... }
ES5的嚴格模式規定,函數只能在頂層做用域和函數內聲明,其餘狀況(好比if代碼塊、循環代碼塊)的聲明都會報錯。函數
// ES5 'use strict'; if (true) { function f() {} // 報錯 }
ES6因爲引入了塊級做用域,這種狀況能夠理解成函數在塊級做用域內聲明,所以不報錯,可是構成區塊的大括號不能少code
// 報錯 'use strict'; if (true) function f() {}
"use strict"; var a = 1; console.log(window.a) // 1 let b = 1; console.log(window.b) // undefined