var聲明及變量提升機(jī)制
function getValue(condition){
if(condition){
var value = "blue";
return value;
} else {
console.log(value);
}
console.log(value);
}
getValue(0)
//undefined
//undefined
在預(yù)編譯階段js引擎會(huì)將上面函數(shù)修改成下面這樣
function getValue(condition){
var value
if(condition){
value = "blue";
return value;
} else {
console.log(value);
}
console.log(value);
}
塊級(jí)聲明
function getValue(condition){
if(condition){
let value = "blue";
} else {
//變量value在此處不存在
return null
}
//變量value在此處不存在
}
var count = 30;
let count = 30;
//Uncaught SyntaxError: Identifier 'count' has already been declared
var count = 30;
if(condition){
let count = 10;
//不會(huì)拋出錯(cuò)誤
}
const maxItems = 30;
const name;
//Uncaught SyntaxError: Missing initializer in const declaration
const maxItems = 5;
maxItems = 6;
//Uncaught TypeError: Assignment to constant variable.
const person = {name: 'binperson'}
//可修改對(duì)象屬性的值
person.name = 'bin'
//拋出語(yǔ)法錯(cuò)誤
person = {
name: 'bin'
}
//Uncaught TypeError: Assignment to constant variable.
臨時(shí)死區(qū)(TDZ)
if(condition){
console.log(typeof value);//引用錯(cuò)誤!
let value = "blue";
}
//Uncaught ReferenceError: value is not defined
console.log(typeof value) //"undefined"
if(condition){
let value = "blue";
}
//循環(huán)中的塊作用域綁定
for(var i = 0; i < 10; i++){
}
console.log(i)//10
for(let j = 0; j < 10; j++){
}
//i在這里不可訪問(wèn)姓言,拋出一個(gè)錯(cuò)誤
console.log(j);
//Uncaught ReferenceError: j is not defined
var funcs = [];
for (var i=0; i < 10; i++){
funcs.push(function(){
console.log(i);
});
}
funcs.forEach(function(func){
func();//輸出10次數(shù)字10
});
var funcs = [];
for(var i = 0; i < 10; i++){
funcs.push(function(value){
return function(){
console.log(value);
}
}(i));
}
funcs.forEach(function(func){
func();//輸出0,然后1蔗蹋、2何荚,直到9
});
var funcs = []
for(let i = 0; i < 10; i++){
funcs.push(function(){
console.log(i);
})
}
funcs.forEach(function(func){
func();//輸出0,然后1猪杭、2兽泣,直到9
});
var funcs = [],
object = {
a: true,
b: true,
c: true
};
for(let key in object){
funcs.push(function(){
console.log(key);
})
}
funcs.forEach(function(func){
func();//輸出a、b胁孙、c
})
//如果使用var聲明key唠倦,則都會(huì)輸出c
var funcs = []
for(const i = 0; i < 10; i++){
funcs.push(function(){
console.log(i);
})
}
funcs.forEach(function(func){
func();
});
//Uncaught TypeError: Assignment to constant variable.
var funcs = [],
object = {
a: true,
b: true,
c: true
};
for(const key in object){//每次迭代不會(huì)修改已有綁定,而是會(huì)創(chuàng)建一個(gè)新綁定
funcs.push(function(){
console.log(key);
})
}
funcs.forEach(function(func){
func();//輸出a涮较、b稠鼻、c
})
//瀏覽器中
var RegExp = "Hello!";
console.log(window.RegExp); //"Hello!"
var ncz = "Hi!";
console.log(window.ncz);//"Hi!"
//let或const不能覆蓋全局變量,而只能屏蔽它
let RegExp = "Hello!";
console.log(RegExp);//"Hello!"
console.log(window.RegExp); //? RegExp() { [native code] }
console.log(window.RegExp === RegExp)//false
const ncz = "Hi!";
console.log(ncz);//"Hi"
console.log(window.ncz);//"Hi!"
console.log(window.ncz === ncz); //true
console.log("ncz" in window)//false
- 如果希望在全局對(duì)象下定義變量狂票,仍然可以使用var候齿。這種情況常見(jiàn)于在瀏覽器中跨frame或跨window訪問(wèn)代碼
塊級(jí)綁定最佳實(shí)踐的進(jìn)化
- 默認(rèn)使用const,只有確實(shí)需要改變變量的時(shí)使用let