JavaScript是基于對象和事件驅動的。應該怎樣理解“基于對象”的意思呢?JavaScript確實有面向對象的特性,但是他的表現形式卻和其他面向對象編程語言大相徑庭。
有種流行的說法: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而定義的變量,默認為全局變量。