調用哪個函數?
你也許正在想命名衝突的問題。比如,下面哪一個叫做calculate的函數會被調用?
Example 8
CODE:
function calculate(number)
{
return number/3;
}
function getHalfOf(num1, num2, num3)
{
function calculate(number)
{
return number/2;
}
var result="";
result+=calculate(num1)+" ";
result+=calculate(num2)+" ";
result+=calculate(num3);
}
var resultString=getHalfOf(10,20,30);
alert(resultString); // 輸出 "5 10 15"
在這個例子中,編譯器會首先搜尋局部記憶體位址,所以它會使用內嵌的calculate函數。如果我們刪除了這個內嵌(局部)的calculate函數,這個代碼會使用全域的calculate函數。
函數:資料類型及建構函式
讓我們來看看函數的另一個特殊功能--這讓它和其它物件類型截然不同。一個函數能夠用來作為一個資料類型的藍圖。這個特性通常被用在物件導向編程中來類比使用者自訂資料類型(user defined data type)。使用使用者自訂資料類型建立的對象通常被成為使用者自訂對象(user defined object)。
資料類型
在定義了一個函數之後,我們也同時建立了一個新的資料類型。這個資料類型能夠用來建立一個新對象。下例,我建立了一個叫做Ball的新資料類型。
Example DT1
CODE:
function Ball()
{
}
var ball0=new Ball(); // ball0 現在指向一個新對象
alert(ball0); // 輸出 "Object",因為 ball0 現在是一個對象
這樣看來,ball0=new Ball()作了什嗎?new關鍵字建立了一個類型是Object的新對象(叫做ball0)。然後它會執行Ball(),並將這個引用傳給ball0(用於調用對象)。下面,你會看到這條訊息:“creating new Ball”,如果Ball()實際上被啟動並執行話。
Example DT2
CODE:
function Ball(message)
{
alert(message);
}
var ball0=new Ball("creating new Ball"); // 建立對象並輸出訊息
ball0.name="ball-0"; // ball0現在有一個屬性:name
alert(ball0.name); // 輸出 "ball-0"
我們可以把上面這段代碼的第6行看做是底下的代碼6-8行的一個簡寫:
CODE:
function Ball(message)
{
alert(message);
}
var ball0=new Object();
ball0.construct=Ball;
ball0.construct("creating new ball"); // 執行 ball0.Ball("creating..");
ball0.name="ball-0";
alert(ball0.name);
這行代碼ball0.construct=Ball和Example 4中的ptr=myFunction文法一致。
如果你還是不明白這行的含義那就回過頭再複習一下Example 4。注意:你也許考慮直接運行ball0.Ball("..."),但是它不會起作用的,因為ball0並沒有一個叫做Ball("...")的屬性,並且它也不知道你究竟想作些什麼。