JS中作用域以及變量范圍分析
變量作用域
js作為一門腳本語言,他與c,java這些語言是不相同的。
全局變量
在js中聲明全局變量,有下面幾種方式:
1.在函數(shù)外通過var來聲明。
var test ="hello";
console.log(test);
function a(){
test="xx";
console.log(test);
}
a();
console.log(test);
結(jié)果:
hello
xx
xx
這種方式通過聲明的變量在任何地方都可進行修改和使用。
2.在函數(shù)中隱士的聲明變量
function a(){
test=22;
console.log(test);
}
a();
console.log(test);
結(jié)果:
22
22
因為js是弱類型腳本語言,在使用之前無需定義,所以可以通過這種方式也能聲明全局變量。
來看一個反例:
var test="aa";
console.log(test);
function a(test){
test=22;
console.log(test);
}
a(test);
console.log(test);
結(jié)果:
aa
22
aa
可以看到在函數(shù)中修改了test值可是第二次在函數(shù)外打印的值沒有變。這是因為在函數(shù)的過程中只是進行了值傳遞。局部變量覆蓋掉了全局變量,只是局部變量 在 修改。
因為在函數(shù)的參數(shù)內(nèi)定義的變量并不是全局變量。
反例二:
function a(){
var test="aa";
console.log(test);
}
a();
console.log(test);
結(jié)果
aa
notdefine
在函數(shù)內(nèi)通過var來聲明的變量是局部變量,函數(shù)外無法訪問。
變量作用域
js的作用域和c與java這些語言的作用域也不相同,騷小孩在以前經(jīng)常會因為這個而頭疼,后來在認真學習了以后才懂了。
1.js中沒有塊范圍。
if(1!=1){
var y=c;
}
console.log(y)
if(1==1){
var x=a;
}
console.log(x);
結(jié)果:
undefine
a
可以看到在if代碼塊定義的兩個變量,在if塊之外去打印,如果判斷成功的話,才會去執(zhí)行里邊的聲明語句,聲明語句執(zhí)行了,那么在代碼塊外邊就可訪問到了。
也可以看出在代碼塊中聲明的變量也是全局變量。
2.js中的全局變量都會成為window的屬性
var x=0; console.log(window.x);
結(jié)果:
0
3.變量提升
var c=0;
function a(){
console.log(c);
}
a();
結(jié)果:
0
var c=0;
function a(){
console.log(c);
var c=11;
}
a();
結(jié)果:
undefine
可以看出在函數(shù)中加了一行聲明語句結(jié)果就會不同,這產(chǎn)生這樣的原因是什么呢?
其實第二個代碼塊的執(zhí)行順序是這樣的:
var c=0;
function a(){
var c;
console.log(c);
c=11;
}
a();
在函數(shù)中他會先把聲明語句提升到第一行,但是并不提升賦值。然后局部變量覆蓋全局變量,在打印c的時候局部變量還沒來的
及賦值所以就是undefine。
變量提升不只會提升會執(zhí)行的變量,不會執(zhí)行的變量也會進行提升:
var c=10;
function a(){
console.log(c);
if(false) {
var c = 10;
}
}
a();
結(jié)果:
undefine
因為在if判斷中定義了局部變量c,雖然if條件不成立,但是也會進行變量提升,所以打印c也是undefine;
4.let變量
通過上面的例子可以看到用var來定義變量的弊端:
1.var定義的變量沒有塊作用域;
2.var定義的全局變量會自動添加全局window對象的屬性;
3.var變量會提前裝載(變量提升);
let就是為了解決這些問題而誕生的。
for(let i=0;i<5;i++){
}
console.log(i);
結(jié)果:
報錯
在代碼塊中定義了let變量,在外部引用的時候不會存在。即存在塊作用域。
let i=10; console.log(window.i);
結(jié)果:
undefine
let聲明的變量并不會成為window的屬性。
var c=10;
function a(){
console.log(c);
let c=1;
console.log(c);
}
a();
在函數(shù)中存在變量與全局變量名相同的c,因此會覆蓋掉全局變量c,但是由于let不會提前裝載,所以在第一個打印語句打印c時會報錯。
到此這篇關于JS中作用域以及變量范圍分析的文章就介紹到這了,更多相關JS變量作用域內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
網(wǎng)頁實時顯示服務器時間和javscript自運行時鐘
如果每秒通過ajax加載服務器時間的話,就會產(chǎn)生大量的請求,于是打算使用js 來解決這個需求2014-06-06

