1、聲明后未賦值,表現(xiàn)相同
(function() {?
?????var varTest;
?????let letTest; ?
????console.log(varTest); //輸出undefined?
????console.log(letTest); //輸出undefined}
());
2、使用未聲明的變量,表現(xiàn)不同
(function() {
? console.log(varTest); //輸出undefined(注意要注釋掉下面一行才能運(yùn)行)
? console.log(letTest); //直接報(bào)錯(cuò):ReferenceError: letTest is not defined
? var varTest = 'test var OK.';
? let letTest = 'test let OK.';
}());
3、重復(fù)聲明同一個(gè)變量,表現(xiàn)不同
(function() {
? var varTest = 'test var OK.';
? ?let letTest = 'test let OK.';
? ?var varTest = 'varTest changed.';
? ?let letTest = 'letTest changed.'; //直接報(bào)錯(cuò):SyntaxError: Identifier 'letTest' has already been declared
? console.log(varTest); //輸出varTest changed.(注意要注釋掉上面letTest變量的重復(fù)聲明才能運(yùn)行)
? console.log(letTest);
}());
4、變量作用范圍不同,表現(xiàn)不同
(function() {
? var varTest = 'test var OK.';
? let letTest = 'test let OK.';
? {
? ? var varTest = 'varTest changed.';
? ? let letTest = 'letTest changed.';
? }
? console.log(varTest); //輸出"varTest changed.",內(nèi)部"{}"中聲明的varTest變量覆蓋外部的letTest聲明
? console.log(letTest); //輸出"test let OK.",內(nèi)部"{}"中聲明的letTest和外部的letTest不是同一個(gè)變量
}());
5、const定義的變量不可以修改,而且必須初始化
? ??const b = 2;//正確// const b;//錯(cuò)誤
????必須初始化 console.log('函數(shù)外const定義b:' + b);//有輸出????值// b = 5;// console.log('函數(shù)外修改const定義b:' + b);//無法輸出
change
6、var定義的變量可以修改,如果不初始化會輸出undefined,不會報(bào)錯(cuò)
var a = 1;
// var a;//不會報(bào)錯(cuò)
console.log('函數(shù)外var定義a:' + a);//可以輸出a=1
function change(){
? ? a = 4;
? ? console.log('函數(shù)內(nèi)var定義a:' + a);//可以輸出a=4} \hange();
function change(){
a = 4;
console.log('函數(shù)內(nèi)var定義a:' + a);//可以輸出a=4
}
change();
console.log('函數(shù)調(diào)用后var定義a為函數(shù)內(nèi)部修改值:' + a);//可以輸出a=4
7、let是塊級作用域,函數(shù)內(nèi)部使用let定義后,對函數(shù)外部無影響
let c=3;