先來看一道題前端
var age = 100;
let year = 6;
(function() {
let age = 10;
var year = age * 3;
console.log(year)
})();
console.log(year)
複製代碼
上結果,運行正常,由於第二次聲明的age, year在函數做用域內 面試
正戲來了bash
var age = 100;
let year = 6;
if (age > 12) {
let age = 10;
var year = age * 3;
}
console.log(year)
複製代碼
發現報錯了, 以下函數
咱們知道在引入let, const以前,JS是沒有所謂的塊做用域.ui
引入後, JS有了全局做用域, 函數做用域, 和let/const + {} => 塊做用域.spa
可是塊做用域卻並無像函數做用域同樣將var聲明的變量限制在塊做用域中,反而是var的聲明提高到全局與let造成了重複聲明而報錯.code
js的塊做用域並不一樣於函數做用域,對var沒有約束性.cdn