javascript 嚴格模式
第一次接觸let關鍵字,有一個要非常非常要注意的概念就是”javascript 嚴格模式”,比如下述的代碼運行就會報錯:
let hello = 'hello world.';
console.log(hello);
錯誤信息如下:
let hello = 'hello world.';
^^^
SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode
...
解決方法就是,在文件頭添加”javascript 嚴格模式”聲明:
'use strict';
let hello = 'hello world.';
console.log(hello);
更多更詳細的關於”javascript 嚴格模式”說明,請參考阮一峯的博客
《Javascript 嚴格模式詳解》
let和var關鍵字的異同
聲明後未賦值,表現相同
'use strict';
(function() {
var varTest;
let letTest;
console.log(varTest); //輸出undefined
console.log(letTest); //輸出undefined
}());
使用未聲明的變量,表現不同:
(function() {
console.log(varTest); //輸出undefined(注意要註釋掉下面一行才能運行)
console.log(letTest); //直接報錯:ReferenceError: letTest is not defined
var varTest = 'test var OK.';
let letTest = 'test let OK.';
}());
重複聲明同一個變量時,表現不同:
'use strict';
(function() {
var varTest = 'test var OK.';
let letTest = 'test let OK.';
var varTest = 'varTest changed.';
let letTest = 'letTest changed.'; //直接報錯:SyntaxError: Identifier 'letTest' has already been declared
console.log(varTest); //輸出varTest changed.(注意要註釋掉上面letTest變量的重複聲明才能運行)
console.log(letTest);
}());
變量作用範圍,表現不同
'use strict';
(function() {
var varTest = 'test var OK.';
let letTest = 'test let OK.';
{
var varTest = 'varTest changed.';
let letTest = 'letTest changed.';
}
console.log(varTest); //輸出"varTest changed.",內部"{}"中聲明的varTest變量覆蓋外部的letTest聲明
console.log(letTest); //輸出"test let OK.",內部"{}"中聲明的letTest和外部的letTest不是同一個變量
}());