Javascript中的變量使用說明
更新時(shí)間:2010年05月18日 19:55:45 作者:
使用過javascript的朋友都知道,在javascript中,變量的使用是個(gè)比較頭疼的問題,經(jīng)常會(huì)產(chǎn)生 些比較匪夷所思的結(jié)果。究其原因,大多是對javascript的變量相關(guān)知識(shí)了解得不夠透徹。
javascript中的所有變量都是類型松散的,不同于其他面向?qū)ο笳Z音的變量聲明都是強(qiáng)類型的.因此Javascript 的變量聲明是不包括類型的。通過var關(guān)鍵字或者直接寫變量名來聲明一個(gè)變量,如:
var v = 1;
v=1;
這時(shí)有人可能會(huì)問,上述的兩種聲明有什么區(qū)別,為什 么會(huì)有這兩種不同的聲明方式,這就涉及到j(luò)avascript中變量的作用域了。在javascript中,變量的作用域包括全局和函數(shù)級(jí)別的。
全局變量可以聲明在函數(shù)體外,無論使用上述的哪種聲明方式,在函數(shù)體外 聲明的變量都是全局變量。如:
<script type="text/javascript" language="javascript">
var v = 1;
function foo()
{
alert(v);
}
w = 2;
function bar()
{
alert(w);
}
foo();
</script>
運(yùn)行結(jié)果:1 2
另外,在函數(shù)內(nèi)部聲明的變量如果不使用var關(guān)鍵字,聲明的變量也將是全局變量。如:
<script type="text/javascript" language="javascript">
function foo()
{
v = 1;
}
foo();
alert(v);
</script>
運(yùn)行結(jié)果:1
但是需要注意,這種情況下,若要使用變量,必須先調(diào)用聲明變量的函數(shù)對變量進(jìn)行初始化, 如foo(),否則,將會(huì)出現(xiàn)“變量v未定義”的錯(cuò)誤。
全局變量將作為window對象的屬性存在,因?yàn)榭梢?通過window.$($表示變量名)訪問。當(dāng)然也可以通過變量名直接訪問。下面會(huì)講到為什么有這兩種訪問方式。
在函數(shù)內(nèi)部通過var關(guān)鍵字聲明的變量將是函數(shù)級(jí)別的變量,其作用域僅僅限于函數(shù)內(nèi)部。如:
<script type="text/javascript" language="javascript">
function foo()
{
var v=1;
alert(v);
}
alert(v);
</script>
運(yùn)行結(jié)果:1 變量“v”未定義
通過上面的分析,可以發(fā)現(xiàn)關(guān)鍵字var主要作用 是定義函數(shù)級(jí)別的變量。
細(xì)心的朋友可以會(huì)問,如果在函數(shù)內(nèi)部和外部定義了相同的變量,會(huì)是什么樣的結(jié)果呢?如:
<script type="text/javascript" language="javascript">
var v=1;
function foo()
{
alert(v);
var v=2;
}
foo();
</script>
運(yùn)行結(jié)果:undefined
?。。。?!也許有人會(huì)比較郁悶了,v明明白白的定義在函數(shù)foo()體外,為什么會(huì)是 undefined呢?這就涉及到j(luò)avascript的解析了。根據(jù)經(jīng)驗(yàn),javascript對于函數(shù)體內(nèi)變量的解析過程是:
搜索所有的 var關(guān)鍵字,將其變量聲明放到函數(shù)體的最前面,賦值和使用仍然保持不變,這樣,上面的javascript實(shí)際上是等同于:
<script type="text/javascript" language="javascript">
var v=1;
function foo()
{
var v;
alert(v);
v=2;
}
foo();
</script>
照此分析,產(chǎn)生上述 的結(jié)果就顯而易見了,由于函數(shù)內(nèi)部的變量的優(yōu)先級(jí)高于全局變量的優(yōu)先級(jí)(大部分的編程語言都是這樣), 函數(shù)內(nèi)部的變量v覆蓋了全局變量v,但是由于在使用函數(shù)內(nèi)部變量v時(shí),它僅僅聲明,但未賦值,因此結(jié)果是undefined。
如果在方法 體內(nèi)仍然要使用定義的全局變量v,window對象此時(shí)派上大大的用場了,可以通過window.v來訪問。如:
<script type="text/javascript" language="javascript">
var v=1;
function foo()
{
alert(window.v);
alert(v);
var v=2;
}
foo();
</script>
運(yùn)行結(jié)果:2 undefined
var v = 1;
v=1;
這時(shí)有人可能會(huì)問,上述的兩種聲明有什么區(qū)別,為什 么會(huì)有這兩種不同的聲明方式,這就涉及到j(luò)avascript中變量的作用域了。在javascript中,變量的作用域包括全局和函數(shù)級(jí)別的。
全局變量可以聲明在函數(shù)體外,無論使用上述的哪種聲明方式,在函數(shù)體外 聲明的變量都是全局變量。如:
復(fù)制代碼 代碼如下:
<script type="text/javascript" language="javascript">
var v = 1;
function foo()
{
alert(v);
}
w = 2;
function bar()
{
alert(w);
}
foo();
</script>
運(yùn)行結(jié)果:1 2
另外,在函數(shù)內(nèi)部聲明的變量如果不使用var關(guān)鍵字,聲明的變量也將是全局變量。如:
復(fù)制代碼 代碼如下:
<script type="text/javascript" language="javascript">
function foo()
{
v = 1;
}
foo();
alert(v);
</script>
運(yùn)行結(jié)果:1
但是需要注意,這種情況下,若要使用變量,必須先調(diào)用聲明變量的函數(shù)對變量進(jìn)行初始化, 如foo(),否則,將會(huì)出現(xiàn)“變量v未定義”的錯(cuò)誤。
全局變量將作為window對象的屬性存在,因?yàn)榭梢?通過window.$($表示變量名)訪問。當(dāng)然也可以通過變量名直接訪問。下面會(huì)講到為什么有這兩種訪問方式。
在函數(shù)內(nèi)部通過var關(guān)鍵字聲明的變量將是函數(shù)級(jí)別的變量,其作用域僅僅限于函數(shù)內(nèi)部。如:
復(fù)制代碼 代碼如下:
<script type="text/javascript" language="javascript">
function foo()
{
var v=1;
alert(v);
}
alert(v);
</script>
運(yùn)行結(jié)果:1 變量“v”未定義
通過上面的分析,可以發(fā)現(xiàn)關(guān)鍵字var主要作用 是定義函數(shù)級(jí)別的變量。
細(xì)心的朋友可以會(huì)問,如果在函數(shù)內(nèi)部和外部定義了相同的變量,會(huì)是什么樣的結(jié)果呢?如:
復(fù)制代碼 代碼如下:
<script type="text/javascript" language="javascript">
var v=1;
function foo()
{
alert(v);
var v=2;
}
foo();
</script>
運(yùn)行結(jié)果:undefined
?。。。?!也許有人會(huì)比較郁悶了,v明明白白的定義在函數(shù)foo()體外,為什么會(huì)是 undefined呢?這就涉及到j(luò)avascript的解析了。根據(jù)經(jīng)驗(yàn),javascript對于函數(shù)體內(nèi)變量的解析過程是:
搜索所有的 var關(guān)鍵字,將其變量聲明放到函數(shù)體的最前面,賦值和使用仍然保持不變,這樣,上面的javascript實(shí)際上是等同于:
復(fù)制代碼 代碼如下:
<script type="text/javascript" language="javascript">
var v=1;
function foo()
{
var v;
alert(v);
v=2;
}
foo();
</script>
照此分析,產(chǎn)生上述 的結(jié)果就顯而易見了,由于函數(shù)內(nèi)部的變量的優(yōu)先級(jí)高于全局變量的優(yōu)先級(jí)(大部分的編程語言都是這樣), 函數(shù)內(nèi)部的變量v覆蓋了全局變量v,但是由于在使用函數(shù)內(nèi)部變量v時(shí),它僅僅聲明,但未賦值,因此結(jié)果是undefined。
如果在方法 體內(nèi)仍然要使用定義的全局變量v,window對象此時(shí)派上大大的用場了,可以通過window.v來訪問。如:
復(fù)制代碼 代碼如下:
<script type="text/javascript" language="javascript">
var v=1;
function foo()
{
alert(window.v);
alert(v);
var v=2;
}
foo();
</script>
運(yùn)行結(jié)果:2 undefined
相關(guān)文章
JavaScript學(xué)習(xí)筆記整理_用于模式匹配的String方法
下面小編就為大家?guī)硪黄狫avaScript學(xué)習(xí)筆記整理_用于模式匹配的String方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09一個(gè)可以兼容IE FF的加為首頁與加入收藏實(shí)現(xiàn)代碼
一個(gè)可以兼容IE FF的加為首頁與加入收藏 好不容易找到,收藏起來。2009-11-11JavaScript中指定函數(shù)名稱的相關(guān)方法
這篇文章主要介紹了JavaScript中指定函數(shù)名稱的相關(guān)方法,是JS入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-06-06