有種流行的說法:JavaScript是基於對象和事件驅動的。應該怎樣理解“基於對象”的意思呢?
《精通JavaScript》告訴我們,對象是JavaScript的基礎,甚至說“JavaScript這門語言就是完全物件導向的”。
我不知道應該怎樣評判這樣的說法,JavaScript確實有物件導向的特性,但是他的表現形式卻和其他物件導向程式設計語言大相徑庭。
在談JavaScript的物件導向之前,我想先說說JavaScript的範圍問題。我想只有搞清楚這個問題,才能更好地理解接下來的內容。我將會用自己的理解將JavaScript中的物件導向特性與一般物件導向程式設計語言(Java/C++等)的一些稱謂對應起來。
首先理清兩個問題:
1.什麼是全域變數?
JavaScript中的全域變數實際上指的是window對象下的對象屬性。
2.範圍劃分。
JavaScript中的範圍是基於上下文,以函數進行劃分的,而不是由塊(block)劃分的。
接下來看一個例子(原例來自《精通JavaScript》,有改動):
<script type="text/javascript">
// 設定全域變數foo,共置為“test”
var foo = "test";
if ( true )
{
// 注意:現在還在全域範圍中
var foo = "new test";
}
// 如我們所見,現在foo等於'new test'了
alert( foo );
// 建立一個會修改變數foo的新函數
function test()
{
//函數內部定義變數不影響全域變數
var foo = "old test";
//隱式定義全域變數
val = 'hello!';
}
// 然而在調用test函數時,foo只在函數範圍內起作用
test();
// 確認foo還是等於'new test'
alert( foo );
// 全域變數實際是window下的屬性
alert( window.foo );
// 函數內部隱式定義的全域變數
alert(val);
</script>
現在你大概對JavaScript的範圍有了一個初步的理解。
要強調的兩點是:
1.在同一範圍中,JavaScript是允許變數的重複定義的,並且後一個定義將覆蓋前一個定義。
2.函數內部如果不加關鍵字var而定義的變數,預設為全域變數。
今天先寫到這裡,明天我將會整理JavaScript中一些物件導向特性與大家分享。