javascript的函數(shù)第2/3頁
指針的指向
我們能夠在一個函數(shù)創(chuàng)建之后重新分配它,但是我們需要指向函數(shù)對象本身,而不是指向它的指針。在下例中,我將改變myfunction()的內(nèi)容。
Example 6:
CODE:
function myFunction()
{
alert("Old");
}
myFunction(); // 輸出 "Old"
myFunction=function()
{
alert("New");
};
myFunction(); // 輸出 "New"
舊函數(shù)哪里去了??被拋棄了。
如果我們需要保留它,我們可以在改變它之前給它分配一個指針。
Example 6A:
CODE:
function myFunction()
{
alert("Old");
}
var savedFuncion=myFunction;
myFunction=function()
{
alert("New");
};
myFunction(); // 輸出 "New"
savedFuncion(); // 輸出 "Old"
不過要小心,象下面這樣的例子并不會有作用,因為是創(chuàng)建了另一個叫做myFunctionPtr的函數(shù)而不是修改它。
Example 6B:
CODE:
function myFunction()
{
alert("Old");
}
var savedFunc=myFunction;
savedFunc=function()
{
alert("New");
};
myFunction(); // 輸出 "Old"
savedFunc(); // 輸出 "New"
內(nèi)嵌函數(shù)
我們還能夠在一個函數(shù)中嵌套一個函數(shù)。下例,我有一個叫做getHalfOf的函數(shù),而在它里面,我有另一個叫做calculate的函數(shù)。
Example 7
CODE:
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"
你只能在內(nèi)部調(diào)用嵌套的函數(shù)。就是說,你不能這么調(diào)用:getHalfOf.calculate(10),因為calculate只有當外部函數(shù)(getHalfOf())在運行的時候才會存在。這和我們前面的討論一致(函數(shù)會被編譯,但只有當你去調(diào)用它的時候才會執(zhí)行)。
調(diào)用哪個函數(shù)?
你也許正在想命名沖突的問題。比如,下面哪一個叫做calculate的函數(shù)會被調(diào)用?
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"
在這個例子中,編譯器會首先搜索局部內(nèi)存地址,所以它會使用內(nèi)嵌的calculate函數(shù)。如果我們刪除了這個內(nèi)嵌(局部)的calculate函數(shù),這個代碼會使用全局的calculate函數(shù)。
函數(shù):數(shù)據(jù)類型及構(gòu)造函數(shù)
讓我們來看看函數(shù)的另一個特殊功能--這讓它和其它對象類型截然不同。一個函數(shù)能夠用來作為一個數(shù)據(jù)類型的藍圖。這個特性通常被用在面向?qū)ο缶幊讨衼砟M用戶自定義數(shù)據(jù)類型(user defined data type)。使用用戶自定義數(shù)據(jù)類型創(chuàng)建的對象通常被成為用戶自定義對象(user defined object)。
數(shù)據(jù)類型
在定義了一個函數(shù)之后,我們也同時創(chuàng)建了一個新的數(shù)據(jù)類型。這個數(shù)據(jù)類型能夠用來創(chuàng)建一個新對象。下例,我創(chuàng)建了一個叫做Ball的新數(shù)據(jù)類型。
Example DT1
CODE:
function Ball()
{
}
var ball0=new Ball(); // ball0 現(xiàn)在指向一個新對象
alert(ball0); // 輸出 "Object",因為 ball0 現(xiàn)在是一個對象
這樣看來,ball0=new Ball()作了什么?new關(guān)鍵字創(chuàng)建了一個類型是Object的新對象(叫做ball0)。然后它會執(zhí)行Ball(),并將這個引用傳給ball0(用于調(diào)用對象)。下面,你會看到這條消息:“creating new Ball”,如果Ball()實際上被運行的話。
Example DT2
CODE:
function Ball(message)
{
alert(message);
}
var ball0=new Ball("creating new Ball"); // 創(chuàng)建對象并輸出消息
ball0.name="ball-0"; // ball0現(xiàn)在有一個屬性: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"); // 執(zhí)行 ball0.Ball("creating..");
ball0.name="ball-0";
alert(ball0.name);
這行代碼ball0.construct=Ball和Example 4中的ptr=myFunction語法一致。
如果你還是不明白這行的含義那就回過頭再復習一下Example 4。注意:你也許考慮直接運行ball0.Ball("..."),但是它不會起作用的,因為ball0并沒有一個叫做Ball("...")的屬性,并且它也不知道你究竟想作些什么。
添加屬性
當我們象上面那樣使用關(guān)鍵字new創(chuàng)建一個對象的時候,一個新的Object被創(chuàng)建了。我們可以在創(chuàng)建之后給這個對象添加屬性(就好像我在上面那樣添加屬性name。而接下來的問題就是如果我們創(chuàng)建了這個對象的另外一個實例,我們得象下面那樣再次給這個新對象添加這個屬性。)
Example DT3 (creates 3 ball objects)
CODE:
function Ball()
{
}
var ball0=new Ball(); // ball0 現(xiàn)在指向了類型Ball的一個新實例
ball0.name="ball-0"; // ball0 現(xiàn)在有一個屬性"name"
var ball1=new Ball();
ball1.name="ball-1";
var ball2=new Ball();
alert(ball0.name); // 輸出 "ball-0"
alert(ball1.name); // 輸出 "ball-1"
alert(ball2.name); // 哦,我忘記給ball2添加“name”了!
我忘記給ball2添加屬性name了,如果在正式的程序中這也許會引發(fā)問題。有什么好辦法可以自動增加屬性呢?嗯,有一個:使用this關(guān)鍵字。this這個詞在function中有特別的意義。它指向了調(diào)用函數(shù)的那個對象。讓我們看看下面的另一個示例,這時候我們在構(gòu)造函數(shù)中添加上這些屬性:
Example DT4
CODE:
function Ball(message, specifiedName)
{
alert(message);
this.name=specifiedName;
}
var ball0=new Ball("creating new Ball", "Soccer Ball");
alert(ball0.name); // prints "Soccer Ball"
請記住:是new關(guān)鍵字最終使得構(gòu)造函數(shù)被執(zhí)行。在這個例子中,它將會運行Ball("creating new Ball", "Soccer Ball");而關(guān)鍵字this將指向ball0。
因此,這行:this.name=specifiedName變成了ball0.name="Soccer Ball"。
它主要是說:給ball0添加屬性name,屬性值是Soccer Ball。
我們現(xiàn)在只是添加了一個name屬性給ball0,看起來和上一個例子中所做的很象,但卻是一個更好更具擴展性的方法?,F(xiàn)在,我們可以隨心所欲的創(chuàng)建許多帶有屬性的ball而無需我們手動添加它們。而且,人們也希望創(chuàng)建的Ball對象能夠清晰的看懂它的構(gòu)造函數(shù)并且能夠輕松找出Ball的所有屬性。讓我們添加更多屬性到Ball里。
Example DT5
CODE:
function Ball(color, specifiedName, owner, weight)
{
this.name=specifiedName;
this.color=color;
this.owner=owner;
this.weight=weigth;
}
var ball0=new Ball("black/white", "Soccer Ball", "John", 20);
var ball1=new Ball("gray", "Bowling Ball", "John", 30);
var ball2=new Ball("yellow", "Golf Ball", "John", 55);
var balloon=new Ball("red", "Balloon", "Pete", 10);
alert(ball0.name); // 輸出 "Soccer Ball"
alert(balloon.name); // 輸出 "Balloon"
alert(ball2.weight); // 輸出 "55"
嘿!使用面向?qū)ο笮g(shù)語,你能夠說Ball是一個擁有如下屬性的對象類型:name, color, owner, weight。
將對象賦給屬性
我們并沒被限制只能添加形如字符串或者數(shù)字之類的簡單數(shù)據(jù)類型作為屬性。我們也能夠?qū)ο筚x給屬性。下面,supervisor是Employee的一個屬性.
Example DT6
CODE:
function Employee(name, salary, mySupervisor)
{
this.name=name;
this.salary=salary;
this.supervisor=mySupervisor;
}
var boss=new Employee("John", 200);
var manager=new Employee("Joan", 50, boss);
var teamLeader=new Employee("Rose", 50, boss);
alert(manager.supervisor.name+" is the supervisor of "+manager.name);
alert(manager.name+"\'s supervisor is "+manager.supervisor.name);
會輸出什么呢?
就像你在上面這個例子中看到的那樣,manager和teamLeader都有一個supervisor屬性,而這個屬性是類型Employee的一個對象。
相關(guān)文章
基于JS實現(xiàn)回到頁面頂部的五種寫法(從實現(xiàn)到增強)
這篇文章主要介紹了基于JS實現(xiàn)回到頁面頂部的五種寫法(從實現(xiàn)到增強)的相關(guān)資料,本文介紹的非常詳細,實用性也非常高,非常具有參考借鑒價值,需要的朋友可以參考下2016-09-09javascript 跨瀏覽器開發(fā)經(jīng)驗總結(jié)(五) js 事件
javascript 跨瀏覽器開發(fā)之js 事件的兼容性問題,需要的朋友可以參考下。2010-05-05JavaScript異步隊列進行try?catch時的問題解決
這篇文章主要介紹了JavaScript異步隊列進行try?catch時的問題解決,文章圍繞主題展開詳細的的相關(guān)內(nèi)容介紹,需要的朋友可以參考一下2022-07-07uniapp開發(fā)APP之強制更新和熱更新的實現(xiàn)
使用uni-app開發(fā),可將代碼編譯到iOS、Android、微信小程序等多個平臺,升級時也需考慮多平臺同步升級,下面這篇文章主要給大家介紹了關(guān)于uniapp開發(fā)APP之強制更新和熱更新的相關(guān)資料,需要的朋友可以參考下2022-12-12