javascript中的所有變量都是類型松散的,不同於其他面向對象語音的變量聲明都是強類型的.因此Javascript 的變量聲明是不包括類型的。通過var關鍵字或者直接寫變量名來聲明一個變量,如:
var v = 1;
v=1;
這時有人可能會問,上述的兩種聲明有什麼區別,為什 麼會有這兩種不同的聲明方式,這就涉及到javascript中變量的作用域了。在javascript中,變量的作用域包括全局和函數級別的。
全局變量可以聲明在函數體外,無論使用上述的哪種聲明方式,在函數體外 聲明的變量都是全局變量。如:
復制代碼 代碼如下:
<script type="text/javascript" language="javascript">
var v = 1;
function foo()
{
alert(v);
}
w = 2;
function bar()
{
alert(w);
}
foo();
</script>
運行結果:1 2
另外,在函數內部聲明的變量如果不使用var關鍵字,聲明的變量也將是全局變量。如:
復制代碼 代碼如下:
<script type="text/javascript" language="javascript">
function foo()
{
v = 1;
}
foo();
alert(v);
</script>
運行結果:1
但是需要注意,這種情況下,若要使用變量,必須先調用聲明變量的函數對變量進行初始化, 如foo(),否則,將會出現“變量v未定義”的錯誤。
全局變量將作為window對象的屬性存在,因為可以 通過window.$($表示變量名)訪問。當然也可以通過變量名直接訪問。下面會講到為什麼有這兩種訪問方式。
在函數內部通過var關鍵字聲明的變量將是函數級別的變量,其作用域僅僅限於函數內部。如:
復制代碼 代碼如下:
<script type="text/javascript" language="javascript">
function foo()
{
var v=1;
alert(v);
}
alert(v);
</script>
運行結果:1 變量“v”未定義
通過上面的分析,可以發現關鍵字var主要作用 是定義函數級別的變量。
細心的朋友可以會問,如果在函數內部和外部定義了相同的變量,會是什麼樣的結果呢?如:
復制代碼 代碼如下:
<script type="text/javascript" language="javascript">
var v=1;
function foo()
{
alert(v);
var v=2;
}
foo();
</script>
運行結果:undefined
!!!!!也許有人會比較郁悶了,v明明白白的定義在函數foo()體外,為什麼會是 undefined呢?這就涉及到javascript的解析了。根據經驗,javascript對於函數體內變量的解析過程是:
搜索所有的 var關鍵字,將其變量聲明放到函數體的最前面,賦值和使用仍然保持不變,這樣,上面的javascript實際上是等同於:
復制代碼 代碼如下:
<script type="text/javascript" language="javascript">
var v=1;
function foo()
{
var v;
alert(v);
v=2;
}
foo();
</script>
照此分析,產生上述 的結果就顯而易見了,由於函數內部的變量的優先級高於全局變量的優先級(大部分的編程語言都是這樣), 函數內部的變量v覆蓋了全局變量v,但是由於在使用函數內部變量v時,它僅僅聲明,但未賦值,因此結果是undefined。
如果在方法 體內仍然要使用定義的全局變量v,window對象此時派上大大的用場了,可以通過window.v來訪問。如:
復制代碼 代碼如下:
<script type="text/javascript" language="javascript">
var v=1;
function foo()
{
alert(window.v);
alert(v);
var v=2;
}
foo();
</script>
運行結果:2 undefined