ES6學習筆記:let的使用

塊級做用域

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;

注意區別undefinedReferenceErrorjava

暫時性死區(TDZ)

只要進入當前塊級做用域,所使用的變量已經存在了,但在聲明以前都屬於死區,不可進行操做。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() {}

聲明的全局變量再也不是window的屬性

"use strict";
var a = 1;
console.log(window.a) // 1

let b = 1;
console.log(window.b) // undefined
相關文章
相關標籤/搜索