var聲明的變量會發生變量提高,在var聲明以前調用該變量會數處undefined,可是let聲明的變量不會發生提高,在聲明以前調用就會報錯es6
// var 的狀況 console.log(foo); // 輸出undefined var foo = 2; // let 的狀況 console.log(bar); // 報錯ReferenceError let bar = 2;
let不容許在相同的做用域內聲明相同的變量不然會報錯數組
// 報錯 function func() { let a = 10; var a = 1; }
塊級做用於有如下兩個用處
內層變量覆蓋外層變量函數
var tmp = new Date(); function f() { console.log(tmp); if (false) { var tmp = 'hello world'; // 這裏會發生變量提高 } } f(); // undefined
用來計數的循環變量泄露爲全局變量es5
var s = 'hello'; for (var i = 0; i < s.length; i++) { console.log(s[i]); } console.log(i); // 5
同時,函數聲明還會提高到所在的塊級做用域的頭部,優先於變量的聲明指針
funtion fun(){}; var fun; // 這裏無論先聲明誰fun輸出的永遠都是函數 fun //f fun(){}
const聲明的常量聲明就必須初始化也就是必須賦值,不然就會報錯(如果定義引用類型數據則能夠改變並不會報錯)code
const obj = {a:{b:2}} a.b=3 obj // {a:{b:3}}
獲取全局對象的方法對象
var getGlobal = function () { if (typeof self !== 'undefined') { return self; } if (typeof window !== 'undefined') { return window; } if (typeof global !== 'undefined') { return global; } throw new Error('unable to locate global object'); };