1.var
特點(diǎn)有三:
- 變量生命提升
- 可重復(fù)定義同一個(gè)名字的變量不報(bào)錯(cuò)
- 全局變量掛載到window
let和const的特性:
- 沒(méi)有變量生命提升
- 不能重復(fù)聲明同一個(gè)變量,即使是var過(guò)的變量权她,甚至是行參也不行岭埠。
- 聲明的變量不會(huì)掛載到window上
- 有塊級(jí)作用域的特點(diǎn)
- 在大括號(hào){}里邊會(huì)形成臨時(shí)死區(qū)
- 可解決閉包問(wèn)題怠缸。
- [const特殊] var和let定義變量睁蕾,const定義常量
console.log(a) //undefined a 變量提升到前面秕狰,相當(dāng)于 var a
var a=10;
這里曾經(jīng)出現(xiàn)過(guò)一個(gè)笑話
console.log(name)//10
var name=10
//這里我毫不猶豫想的肯定是undefined 帘皿,其實(shí)打印的是10东跪,因?yàn)閚ame是JavaScript內(nèi)置的對(duì)象。
//name不是關(guān)鍵字鹰溜,是window下自有的屬性虽填。所以一般不會(huì)用name當(dāng)做變量名使用
let 和 const 聲明的變量沒(méi)有變量提升。
console.log(a);//報(bào)錯(cuò) Cannot access 'a' before initialization
//變量無(wú)法提升;
let a = 10;
console.log(b);//報(bào)錯(cuò) Cannot access 'b' before initialization
//變量無(wú)法提升;
const b = 10;
var 能重復(fù)聲明奉狈。
var a = 10;
var a = 20;
console.log(a)//20
let 和 const 不能重復(fù)聲明卤唉。
let a = 10;
let a = 20;//報(bào)錯(cuò)Uncaught SyntaxError: Identifier 'a' has already been declared
const b = 10;
const b = 20;//報(bào)錯(cuò) 'b' has already been declared
var 和 let 聲明時(shí)可以不用設(shè)置初始值。
var a,let b;
a = 10;
b = 20;
console.log(a,b)//10,20
const 聲明時(shí)必須設(shè)置初始值仁期,不能使用 null 占位桑驱。
const a;
a = 20;//報(bào)錯(cuò) Missing initializer in const declaration
var 沒(méi)有塊級(jí)作用域
for(var i=0;i<3;i++){
console.log(i);//0,1,2
}
console.log(i);//3,沒(méi)有塊級(jí)作用域竭恬,外層也能訪問(wèn)
if(true){
var a = 10;
}
console.log(a);//10
let 和 const 有塊級(jí)作用域
for(let i=0;i<3;i++){
console.log(i);//0,1,2
}
console.log(i);//報(bào)錯(cuò) i is not defined,有塊級(jí)作用域,外層不能訪問(wèn)
if(true){
let a = 10;
}
console.log(a);//報(bào)錯(cuò) a is not defined
if(true){
const b = 10;
}
console.log(b);//報(bào)錯(cuò) b is not defined
var 不存在暫時(shí)性死區(qū)
var a = 10;
if(true){
console.log(a);//10
var a = 20;
}
let 和 const 存在暫時(shí)性死區(qū)
var a = 10;
if(true){
console.log(a);//報(bào)錯(cuò) Cannot access 'a' before initialization
let a = 20;
}
var b = 10;
if(true){
console.log(b);//報(bào)錯(cuò) Cannot access 'b' before initialization
const b = 20;
}
常見面試題
function sayHi() {
console.log(name)
console.log(age)
var name = 'Lydia'
let age = 21
}
sayHi() //undefined 和 ReferenceError
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1)
}
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1)
}
// 0 1 2 和 3 3 3