一:let和const命令
1.let命令
(1) ES6新增了let命令,用來聲明變量。用法類似于var,但是聲明的變量,只在let命令所在的代碼塊內有效。
例一:
{
? ? let a = 10;
? ? var b=1;
}
a// ReferenceError: a is not defined.
b//1
上面這兩段代碼聲明了兩個變量,然后在代碼塊之外調用這兩個變量,結果let聲明的變量報錯,var聲明的變量返回了正確的值 ,這表明,let聲蝗的變量只在它所在的代碼塊有效。
例二:
for (let i=0; i<arr.length; i++) {}
console.log(i)
//ReferenceError: i is not defined
上面代碼的計數器的i,只在for循環體內有效
例三:
下面的代碼如果使用var,最后輸出的是9
var a=[ ];
for( var i = 0; i<10;i++) {
? ? var c = i;
? ? a[ i ] = function () {
? ? ?console.log(c)
? ? }
}
a [ 6 ]()
//9
例四:
聲明的變量僅在塊級作用域內有效,最后輸出的是6
var a=[ ];
for( var i = 0; i<10;i++) {
? ? let c = i;
? ? a[ i ] = function () {
? ? ? ? console.log(c)
? ? }
}
a [ 6 ]()
//6
(2)let不允許在相同作用域內,重復聲明同一個變量。
以下兩種情況都會報錯
{
? ? let a=10;
? ? var a=1;
}
{
? ? let a=10;
? ? let a=1;
}
(3) let實際上為JavaScript新增了塊級作用域。
例一
function () {
? ? let ? ?n = 5;
? ? if ( true ) {
? ? ? ? let n = 10;
? ? }
console.log(n) ? ?//5
}
上面的函數有兩個代碼塊,都聲明了變量n,運行后輸出5。這表示外層代碼塊不受內層代碼塊的影響。如果使用var定義變量n,最后輸出的值就是10。
例二:
function f() { ?console.log ( ' I am outside! ' ); }
( function () {
? ? if ( false ) {
? ? ? ? function f() { console.log ( ' I am inside! ' ); }
? ? }
? ? f ( );
})( );
上面代碼在ES5中運行,會得到“I am inside!”,
但是在ES6中運行,會得到“I am outside!”。
因為ES5存在函數提升,不管會不會進入if代碼塊,函數聲明都會提升到當前作用域的頂部,得到執行;
而ES6支持塊級作用域,不管會不會進入if代碼塊,其內部聲明的函數皆不會影響到作用域的外部。
需要注意的是,如果在嚴格模式下,函數只能在頂層作用域和函數內聲明,其他情況(比如if代碼塊、循環代碼塊)的聲明都會報錯。
二:const命令
const也用來聲明變量,但是聲明的是常量。一旦聲明,常量的值就不能改變。
也與let一樣不可重復聲明,只在聲明所在的塊級作用域內有效。
例一:
改變常量的值是不起作用的,對常量重新賦值不會報錯,只會默默地失敗。
const ?PI=3.1415;
PI ?// 3.1415
PI = 3;
PI? // 3.1415
constPI=3.1;
PI // ?3.1415
例二:
不可重復聲明
var ?message="Hello!";
let ?age=25;
// 以下兩行都會報錯
const ?message="Goodbye!";
const ?age=30;