《JavaScript高級程序設(shè)計(jì)》讀書筆記(八):Function類及閉包
Function類
定義
Function類可以表示開發(fā)者定義的任何函數(shù),用Function類直接創(chuàng)建函數(shù)的語法如下:
var function_name=new Function(agrument1,agrument2,...,argumentN,function_body);
每個(gè)argument都是一個(gè)參數(shù),最后一個(gè)參數(shù)是函數(shù)主體(要執(zhí)行的代碼)。
示例:
function sayHi(sName,sMessage){
alert("Hello "+sName+","+sMessage);
}
還可以如下定義它:
var sayHi=new Function("sName","sMessage","alert(\"Hello\"+sName+\",\"+sMessage);");
注:盡管可用Function構(gòu)造函數(shù)創(chuàng)建函數(shù),但最好不要使用它,因?yàn)橛盟x函數(shù)比用傳統(tǒng)方式要慢得多。不過,所有函數(shù)都應(yīng)看作是Function類的實(shí)例。
屬性和方法
因?yàn)楹瘮?shù)是引用類型,所以它們也有屬性和方法,ECMAScript定義的屬性length聲明了函數(shù)期望的參數(shù)個(gè)數(shù),例如:
function doAdd(iNum){
alert(iNum+10);
}
function sayHi(){
alert("Hi");
}
alert(doAdd.length);//outpus 1
alert(sayHi.length);//outpus 0
Function對象也有與所有對象共享的標(biāo)準(zhǔn)valueOf()方法和toString()方法,這兩個(gè)方法返回的都是函數(shù)的源代碼,在調(diào)試時(shí)尤其有用。
例如:
function doAdd(iNum){
alert(iNum+10);
}
alert(doAdd.toString());
這段代碼輸出了doAdd()函數(shù)的文本。
閉包
定義
所謂閉包,是指詞法表示包括不必計(jì)算的變量的函數(shù),也就是說,該函數(shù)能使用函數(shù)外定義的變量。在ECMAScript中使用全局變量是一個(gè)簡單的閉包實(shí)例。
示例:
var sMessage="Hello World";
function sayHelloWold(){
alert(sMessage);
}
sayHelloWorld();
在一個(gè)函數(shù)中定義另一個(gè)函數(shù)會使閉包變得更復(fù)雜,如:
var iBaseNum=10;
function addNumbers(iNum1,iNum2){
function doAddtion(){
return iNum1+iNum2+iBaseNum;
}
return doAddtion();
}
這里函數(shù)addNumbers()包括函數(shù)doAddtion()(閉包)。內(nèi)部函數(shù)是個(gè)閉包,因?yàn)樗鼘@取外部函數(shù)的參數(shù)iNum1和iNum2以及全局變量iBaseNum的值。addNumbers()的最后一步調(diào)用了內(nèi)部函數(shù),把兩個(gè)參數(shù)和全局變量相加,并返回它們的和。這里要掌握的重要概念是doAddtion()函數(shù)根本不接受參數(shù),它使用的是從執(zhí)行環(huán)境中獲取的。
可以看到,閉包是ECMAScript中非常強(qiáng)大多用的一部分,可以用于執(zhí)行復(fù)雜的計(jì)算。就像使用任何高級函數(shù)一樣,在使用閉包時(shí)要當(dāng)心,因?yàn)樗鼈兛赡軙兊梅浅?fù)雜。
本文示例代碼

作者:Artwl
本文首發(fā)博客園,版權(quán)歸作者跟博客園共有。轉(zhuǎn)載必須保留本段聲明,并在頁面顯著位置給出本文鏈接,否則保留追究法律責(zé)任的權(quán)利。
浙公網(wǎng)安備 33010602011771號