1、var嗅绰。var聲明的變量沒有塊級作用域舍肠,而且存在變量名提升的情況搀继。這里舉例說明。
<script>
var num = 123;
function foo(){
console.log(num); // undefined
var num = 46;
console.log(num) // 46
}
foo()
</script>
為什么第一個(gè)輸出值會(huì)是undefined翠语,而不是123呢叽躯?因?yàn)檫@里存在著變量名的提升,其實(shí)上述語句相當(dāng)于:
<script>
var num = 123;
function foo(){
var num;
console.log(num); // undefined
num = 46;
console.log(num) // 46
}
foo()
</script>
上面主要體現(xiàn)了var存在著變量名的提升肌括,那么它沒有塊級作用域又是怎么體現(xiàn)的呢点骑?最常見的是在條件語句里面,如if語句谍夭、for語句黑滴。這里以if語句為例。
<script>
var num = 123;
if(true){
console.log(num) // 123
var num = 456;
console.log(num) // 456
}
console.log(num) // 456
</script>
這里為什么第一個(gè)輸出值不是undefined紧索,第三個(gè)輸出值不是123呢袁辈?原因是這樣的,因?yàn)関ar不存在塊級作用域珠漂,且變量名會(huì)提升晚缩,所以上述代碼其實(shí)相當(dāng)于:
<script>
var num;
num = 123
if(true){
console.log(num) // 123
num = 456;
console.log(num) // 456
}
console.log(num) // 456
</script>
所以在我看來,var其實(shí)是有利有弊的媳危,利就是不用去管什么常量與變量的荞彼,直接使用var就行,弊就是不存在塊級作用域且變量名會(huì)提升待笑,這會(huì)在無形之中給我們帶來許多意想不到的問題
2卿泽、const(es6中用來定義常量的一個(gè)關(guān)鍵字(當(dāng)然了,其他語言里也存在著const滋觉,這里僅指在js中)。常用來聲明常量齐邦,且常量不可修改椎侠,必須初始化,存在著塊級作用域措拇。
(1)不存在名稱提升問題我纪。以代碼說事兒。
<script>
function foo(){
console.log(num);
const num = 456;
console.log(num)
}
foo()
</script>
運(yùn)行上述代碼會(huì)發(fā)現(xiàn)會(huì)報(bào)錯(cuò) Uncaught ReferenceError: num is not defined 丐吓。這里說明浅悉,使用const來定義的常量名并沒有提升。
(2)聲明時(shí)必須初始化券犁。假如用const聲明的常量并沒有初始化呢术健?會(huì)有問題嗎?直接上代碼
<script>
const num;
console.log(num)
</script>
這里運(yùn)行后發(fā)現(xiàn)會(huì)報(bào)錯(cuò)粘衬。 Uncaught SyntaxError: Missing initializer in const declaration 意思是:語法錯(cuò)誤荞估,在const聲明中沒有初始化咳促。
同樣的代碼,只是const聲明初始化勘伺,結(jié)果會(huì)不會(huì)有變化呢跪腹?答案是不言而喻的了。
(3)存在著塊級作用域飞醉。什么叫塊級作用域呢冲茸?上代碼:
<script>
const num = 456
if(true){
const num = 789;
console.log(num); // 789
}
console.log(num) // 456
</script>
可見在if語句內(nèi)聲明的常量在if語句外并不能訪問到,這里與var不同缅帘。這里是以if語句為例的轴术,當(dāng)然在for語句亦或是函數(shù)內(nèi)都是這樣的,存在著塊級作用域
3股毫、let(es6中用來定義變量的一個(gè)關(guān)鍵字)膳音。let定義的變量存在著塊級作用域,在函數(shù)內(nèi)定義的變量铃诬,對函數(shù)外部無影響祭陷。
(1)在函數(shù)內(nèi)部定義的變量,對函數(shù)外部無影響趣席,即存在著塊級作用域兵志。
<script>
let num = 789;
function foo(){
let num = 46;
console.log(num) // 46
}
foo()
console.log(num) // 789
</script>
(2)不存在著變量名的提升。
<script>
function foo(){
console.log(num); // Uncaught ReferenceError: num is not defined
let num = 46;
console.log(num)
}
foo()
</script>
運(yùn)行后發(fā)現(xiàn)會(huì)報(bào)錯(cuò)宣肚,可見使用let聲明的變量想罕,并不像var那樣存在著變量名的提升問題。
作者:江峰★
出處:http://www.cnblogs.com/jf-67/
本文版權(quán)歸作者和博客園共有霉涨,歡迎轉(zhuǎn)載按价,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接笙瑟,否則保留追究法律責(zé)任的權(quán)利