在函數(shù)內(nèi)部,有兩個特殊的對象:arguments和this。其中,arguments在曾經(jīng)介紹過,它是一個類數(shù)組對象,包含著傳入函數(shù)中的所有參數(shù)。雖然arguments的主要用途是保存函數(shù)參數(shù),但這個對象還有一個名叫callee的屬性,該屬性是一個指針,指向擁有這個arguments對象的函數(shù)。
請看下面這個非常經(jīng)輿的階乘函數(shù):
function factorial (num){
if (num<=1){
return 1:
}else{
return num * factorial(num-l)
}
}
南昌網(wǎng)站優(yōu)化公司技術(shù)員認為定義階乘函數(shù)一般都要用到遞歸算法;如上面的代碼所示,在函數(shù)有名字,而且名字以后也不會變的情況下,這樣定義沒有問題。但問題是這個函數(shù)的執(zhí)行與函數(shù)名factorial緊緊耦合在了一起。為了消除這種緊密耦合的現(xiàn)象,可以像下面這樣使用argumnents.callee:
function factorial (num)(
if (num<=1){
return 1:}
else{
return num * arguments.callee (num-l)
}
}
在這個重寫后的factorial()函數(shù)的函數(shù)體內(nèi),沒有再引用函數(shù)名factorial。這樣,無論引用函數(shù)時使用的是什么名字,都可以保證正常完成遞歸調(diào)用。例如:
var trueFactorial= factorial;
factorial= function()(
return 0:
);
alert(trueFactorial(5))j //120
alert(factorial (5)); //0
茌此,變量trueFactorial獲得了factorial的值,實際上是在另一個位置上保存了一個函數(shù)的指針。然后,我們又將一個簡單地返回0的函數(shù)賦值給factorial變量。如果像原來的factorial()那樣不使用arguments.callee,調(diào)用trueFactorial()就會返回0??墒牵诮獬撕瘮?shù)體內(nèi)的代碼與函數(shù)名的耦合狀態(tài)之后,trueFactorial()仍然能夠正常地計算階乘;至于factorial(),它現(xiàn)在只是一個返回0的函數(shù)。
函數(shù)內(nèi)部的另一個特殊對象是this,其行為與Java和C#中的this大致類似。換句話說,this引用的是函數(shù)據(jù)以執(zhí)行操作的對象——或者也可以說,this是函數(shù)在執(zhí)行時所處的作用域(當在網(wǎng)頁的全局作用域中調(diào)用函數(shù)時,this對象引用的就是window)。來看下面的例子:
windndow. color = "red";
var o = { color: "blue" };
function sayColor(){
alert(this.color);
}
sayColor(); //"red"
o.sayColor=sayColor;
o.sayColor(); //"blue"
上面這個函數(shù)sayColor()是在全局作用域中定義的,它引用了this對象。由于在調(diào)用函數(shù)之前,this的值并不確定,因此this可能會在代碼執(zhí)行過程中引用不同的對象。當在全局作用域中調(diào)用sayColor()時,this引用的是全局對象window;換句話說,對this.color求值會轉(zhuǎn)換成對window.color求值,于是結(jié)果就返回了"red"。而當把這個函數(shù)賦給對象o并調(diào)用o.sayColor()時,this引用的是對象o,因此對this.color隸值會轉(zhuǎn)換成對o.color求值,結(jié)果就返回了"blue"。
南昌網(wǎng)站建設(shè)公司工程師提示,讀者一定要牢記函數(shù)的名字僅僅是一個包含指針的變量而已,因此,即是在不同的環(huán)境中執(zhí)行,全局的sayColor()函數(shù)與o.sayColor()指向的仍然是同一個函數(shù)。
希望對廣大站長或網(wǎng)站建設(shè)公司或從事企業(yè)網(wǎng)站建設(shè)的團隊有所幫助,如對此不太理解的,可以與南昌網(wǎng)絡(luò)公司百恒網(wǎng)絡(luò)技術(shù)部聯(lián)系。我們很高與廣大站長和網(wǎng)站建設(shè)公司技術(shù)人員分享我們的技術(shù)和經(jīng)驗。