var : 做用域是函數體的所有,聲明變量提高
函數
console.log(num);//undefined var num = 2 //循環內變量過分共享 for (var i = 0; i < 4; i++) { alert(i);//0,1,2,3 } for (var i = 0; i < 4; i++) { setTimeout(function () { alert(i)//4,4,4,4 }, i * 100); }
循環自己及三次timeout回調均共享惟一的變量i。當循環結束執行時,i的值爲4,此時回調還沒有被觸發.
因此當第一個timeout執行時,調用alert(i),此時i的值爲4,因此最終彈出來的是4.code
let聲明的變量擁有塊級做用域,聲明的全局變量不是全局對象的屬性,聲明的變量直到控制流到達該變量被定義的代碼行時纔會被裝載,用let重定義變量會拋出一個語法錯誤
對象
var j = 100; for (let i = 0; i < 4; i++) { console.log(j)//not defined,暫時性死去,即便在該做用域外已經存在這個變量,若是做用域內須要使用 let、 const 再次聲明,則必須提早,不然沒法使用,直到聲明後纔可使用 setTimeout(function () { alert(i)//0、一、二、3,塊級做用域 }, i * 100); let j = 0; //let j = 2;//SyntaxError,重定義變量會拋出一個語法錯誤 console.log(j)//0,0,0,0 } window.i//undefined,不是全局對象的屬性
const聲明的變量與let聲明的變量相似,它們的不一樣之處在於,const聲明的變量只能夠在聲明時賦值,不可隨意修改,不然會致使SyntaxError(語法錯誤).
作用域
const num = 1; num = 2;// Assignment to constant variable