Var:作用域是依照所属的函式位于的区块内,且可以重複宣告。
for (var i = 0; i < 3; i++) { }; console.log(i); //3 (function () { for (var j = 0; j < 3; j++) { }; }()); console.log(j); //j is not defined var boy = 'TOM'; var boy = 'BOB'; console.log(boy); //BOB
let:作用域是依照所属{}
区块内,且不可以重複宣告。
for (let i = 0; i < 3; i++) { console.log(i); //0 1 2 }; console.log(i); //i is not defined (function () { for (var j = 0; j < 3; j++) { }; }()); console.log(j); //j is not defined var boy = 'TOM'; var boy = 'BOB'; console.log(boy); //Identifier 'boy' has already been declared { let boy = 'TOM'; console.log(boy); //TOM }; let boy = 'BOB'; console.log(boy); //BOB
TDZ(暂时性死区):let一样会有hoisting,但是在创造阶段,无法呼叫变数;如果是var,则会出现该变数是undefined的值。
const:作用域是依照所属{}
区块内,且不可以重複宣告,或是重複赋值;如果内容(值)是个物件,那么此物件的内容(物件的参数)是可以更改的。
var boy = 'TOM'; boy = 'BOB'; console.log(boy); //BOB let boy = 'TOM'; boy = 'BOB'; console.log(boy); //BOB const boy = 'TOM'; boy = 'BOB'; console.log(boy); //Uncaught TypeError: Assignment to constant variable. const family = { father: 'TOM', mothetr: 'Mar', }; family.father = 'Park' console.log(family.father); //Park family = {}; //Uncaught TypeError: Assignment to constant variable.