c语言块级作用域_块级作用域问题ES5 ES6
ES5:
1.? 沒有塊級作用域
在其他類C語言中,由花括號封閉的代碼塊都有自己的作用域(如果用ECMAScript的話來說,就是它們自己的執(zhí)行環(huán)境),
所以支持根據條件來定義變量。
if(true){var color = 'blue';
}
console.log(color);//'blue'
這里是在一個if語句中定義了變量color。如果是在C、C++或Java中,color會在if語句執(zhí)
行完畢后被銷毀。但在JavaScript中,if語句中的變量聲明會將變量添加到當前的執(zhí)行環(huán)境(在這里是
全局環(huán)境)中。在使用for語句時,尤其要牢記這一差異,例如:
for(var i=0; i < 10; i++){
doSomething(i);
}
console.log(i);//10
2.? 使用var聲明的變量會自動被添加到最近的執(zhí)行環(huán)境中。
//'use strict';
var a2 = 'Hera';functionaaa(){var a2 = 'Apollo'; //aaa函數作用域的a2,不會影響到全局作用域的a2,注意區(qū)分
functionbbb(){
a2= 'Diana'; //由于閉包,訪問的是調用aaa函數之后產生的局部函數執(zhí)行環(huán)境中的a2變量。
a1= 'Medusa'; //沒有使用var聲明,在非嚴格模式下,當bbb函數調用之后,a1會被添加到全局環(huán)境。
//在嚴格模式下會直接報錯a1 is not defined
}
bbb();
console.log(a2);
}
aaa();
console.log(a2);//全局環(huán)境聲明的 a2 'Hera'
console.log(a1);//bbb函數被調用后,被添加到全局環(huán)境的a1變量
//嚴格模式時,在調用bbb時,a1 = 'Medusa'這一行就會報錯a1 is not defined
3.查詢標識符
在上一步中,bbb函數中a2 = 'Diana' ,就是一個查詢標識符的過程。a2沒有使用var聲明,向上一級aaa函數的作用域開始查詢,
查詢到了var a2? = 'Apollo'之后,再賦值,那么這個時候,aaa作用域的a2已然變成了 ‘Diana’。
需要注意的是,下面這個例子:
var color = "blue";functiongetColor(){var color = "red";returncolor;
}
console.log(getColor());//"red"
這種情況下,任何位于局部變量color的聲明之后的代碼,如果不使用window.color,都無法訪問全局color變量。
ES6:
1.var聲明與變量提升
使用var關鍵字聲明的變量,無論其實際聲明位置在何處,都會被視為聲明于所在函數的頂部(如果聲明不在任何函數內,
則視為在全局作用于的頂部)。這就是所謂的變量提升(hoisting)。為了說明變量提升的含義,見下列例子:
functiongetValue(condition) {if(condition){var value = "blue";//其他代碼
returnvalue;
}else{//value 在此處可訪問,值為 undefined
return null;
}//value 在此處可訪問,值為 undefined
}
如果你不太熟悉 JS ,或許會認為僅當 condition 的值為 true 時,變量 value 才會被創(chuàng)建。
但實際上,value 無論如何都會被創(chuàng)建。 JS 引擎在后臺對 getValue 函數進行了調整, 就像這樣:
functiongetValue(condition) {varvalue;if(condition) {
value= "blue";//其他代碼
returnvalue;
}else{return null;
}
}
value 變量的聲明被提升到了頂部,而初始化工作則保留在原處。這意味著在 else 分支內
value 變量也是可訪問的,此處它的值會是 undefined ,因為它并沒有被初始化。
那么其實之前的代碼可以寫成
varcolor;if(true){
color= 'blue';
}
console.log(color);//'blue'
vari;for(i=0; i < 10; i++){
doSomething(i);
}
console.log(i);//10
2.塊級聲明
塊級聲明也就是讓所聲明的變量在指定塊的作用域外無法訪問。
1.在一個函數內部
2.在一個代碼塊(由一對花括號包裹)內部
塊級作用域是很多類 C 語言的工作機制, ES6 引入塊級聲明,是為了給 JS 添加靈活性以及 與其他語言的一致性。
3.let聲明
還有需要注意的一點是,let并不影響閉包。
總結
以上是生活随笔為你收集整理的c语言块级作用域_块级作用域问题ES5 ES6的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        