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