一:let和const命令
1.let命令
(1) ES6新增了let命令,用來聲明變量映挂。用法類似于var鞭莽,但是聲明的變量,只在let命令所在的代碼塊內(nèi)有效唐断。
例一:
{
? ? let a = 10;
? ? var b=1;
}
a// ReferenceError: a is not defined.
b//1
上面這兩段代碼聲明了兩個變量选脊,然后在代碼塊之外調(diào)用這兩個變量,結(jié)果let聲明的變量報錯脸甘,var聲明的變量返回了正確的值 恳啥,這表明,let聲蝗的變量只在它所在的代碼塊有效丹诀。
例二:
for (let i=0; i<arr.length; i++) {}
console.log(i)
//ReferenceError: i is not defined
上面代碼的計數(shù)器的i角寸,只在for循環(huán)體內(nèi)有效
例三:
下面的代碼如果使用var菩混,最后輸出的是9
var a=[ ];
for( var i = 0; i<10;i++) {
? ? var c = i;
? ? a[ i ] = function () {
? ? ?console.log(c)
? ? }
}
a [ 6 ]()
//9
例四:
聲明的變量僅在塊級作用域內(nèi)有效,最后輸出的是6
var a=[ ];
for( var i = 0; i<10;i++) {
? ? let c = i;
? ? a[ i ] = function () {
? ? ? ? console.log(c)
? ? }
}
a [ 6 ]()
//6
(2)let不允許在相同作用域內(nèi)扁藕,重復聲明同一個變量沮峡。
以下兩種情況都會報錯
{
? ? 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
}
上面的函數(shù)有兩個代碼塊亿柑,都聲明了變量n邢疙,運行后輸出5。這表示外層代碼塊不受內(nèi)層代碼塊的影響望薄。如果使用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存在函數(shù)提升另绩,不管會不會進入if代碼塊,函數(shù)聲明都會提升到當前作用域的頂部花嘶,得到執(zhí)行笋籽;
而ES6支持塊級作用域,不管會不會進入if代碼塊椭员,其內(nèi)部聲明的函數(shù)皆不會影響到作用域的外部车海。
需要注意的是,如果在嚴格模式下隘击,函數(shù)只能在頂層作用域和函數(shù)內(nèi)聲明侍芝,其他情況(比如if代碼塊、循環(huán)代碼塊)的聲明都會報錯埋同。
二:const命令
const也用來聲明變量竭贩,但是聲明的是常量。一旦聲明莺禁,常量的值就不能改變留量。
也與let一樣不可重復聲明,只在聲明所在的塊級作用域內(nèi)有效哟冬。
例一:
改變常量的值是不起作用的楼熄,對常量重新賦值不會報錯,只會默默地失敗浩峡。
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;