Javascript 的 1.7 版本加入了 let 關(guān)鍵字(該新特性屬于 ECMAScript 2015(ES6)規(guī)范,在使用時請注意瀏覽器兼容性)。let 關(guān)鍵字聲明了一個塊級作用域的本地變量,在聲明變量時可以的同時賦值。
與 var 不同的是,let 是把變量的作用域限制在塊級域中。var 聲明的變量要么是全局的,要么就是函數(shù)級別的,無法是塊級。塊級域可以理解為一個 if else 中,或者 for 循環(huán)域中。
下面是 var 聲明變量的例子??梢钥吹?,變量在聲明之后,在整個函數(shù)中都是可用的。如果想要聲明全局變量,把變量放到函數(shù)體外即可。
'use strict';
function foo(){
for (var i = 0; i < 10; i++) {
console.log('in block ' + i);
/* 塊級域內(nèi),i 可用*/
}
/* 函數(shù)域內(nèi),i 可用*/
console.log('out of block ' + i);
}
/*函數(shù)域外,i 不可用*/
foo();
下面是 let 聲明變量的例子,跟上面的代碼不同之處只有用 let 替換了 var。這樣變量就只在 for 循環(huán)體內(nèi)有效了。不管是在 for 循環(huán)之前還是之后訪問變量 i,都會提示 “ReferenceError: i is not defined” 的錯誤。
'use strict';
function foo(){
for (let i = 0; i < 10; i++) {
console.log('in block ' + i);
/* 塊級域內(nèi),i 可用*/
}
/* 函數(shù)域內(nèi),i 不可用*/
}
/*函數(shù)域外,i 是不可用*/
foo();
上面?zhèn)z個例子,var 聲明的變量是在整個函數(shù)作用域內(nèi)有效,let 是在 for 循環(huán)的塊級域內(nèi)有效。當然用 let 也可以聲明全局變量,把 let 放到函數(shù)體外就可以了,如下例子。
'use strict';
let i;
function foo(){
for ( i = 0; i < 10; i++) {
console.log('in block ' + i);
/* 塊級域內(nèi),i 可用*/
}
/* 函數(shù)域內(nèi),i 可用*/
console.log('out of block ' + i);
}
foo();
/*函數(shù)域外,i 可用*/
console.log('out of function ' + i);
已經(jīng)廢棄的 let 擴展
let block 和 let expression 的語法將要被廢除,請不要再使用,參見 鏈接1 和 鏈接2
let block 提供了一種在塊的范圍內(nèi)獲取變量的值,而不會影響塊外面名字相同的變量的值的方法。
'use strict';
var a = 1;
var b = 2;
let (a = a + 2, b = 3) {
console.log( a + b ); // 6
}
console.log( a + b ); // 3
let expression 提供建立一個變量,只在一個表達式中有效。
'use strict';
var a = 1;
let(a = 2) console.log(a); // 2
console.log(a); // 1
總結(jié)
變量聲明在任何開發(fā)語言中都是非?;A(chǔ)的內(nèi)容,變量的作用域可以分為全局變量和局部變量。在 javasctipt 中,作用域的概念和其他語言差不多, 在每次調(diào)用一個函數(shù)的時候 ,就會進入一個函數(shù)內(nèi)的作用域,當從函數(shù)返回以后,就返回調(diào)用前的作用域。但在 C 語言中,一個在 for 循環(huán)中定義的變量,是不可能在循環(huán)外被調(diào)用的。這是javascript 本身不嚴謹?shù)牡胤剑砸?let 關(guān)鍵字解決這個問題。
Javascript 是一種腳本語言,在腳本執(zhí)行時,是要經(jīng)過預(yù)編譯的。關(guān)于“JavaScript的作用域鏈”和“Javascript的預(yù)編譯”可以學(xué)習(xí)鳥哥的這篇文章。