深入認(rèn)識(shí)JavaScript中的函數(shù)
2024-09-06 12:43:39
供稿:網(wǎng)友
概述
函數(shù)是進(jìn)行模塊化程序設(shè)計(jì)的基礎(chǔ),編寫(xiě)復(fù)雜的Ajax應(yīng)用程序,必須對(duì)函數(shù)有更深入的了解。JavaScript中的函數(shù)不同于其他的語(yǔ)言,每個(gè)函數(shù)都是作為一個(gè)對(duì)象被維護(hù)和運(yùn)行的。通過(guò)函數(shù)對(duì)象的性質(zhì),可以很方便的將一個(gè)函數(shù)賦值給一個(gè)變量或者將函數(shù)作為參數(shù)傳遞。在繼續(xù)講述之前,先看一下函數(shù)的使用語(yǔ)法:
function func1(…){…}
var func2=function(…){…};
var func3=function func4(…){…};
var func5=new Function();
這些都是聲明函數(shù)的正確語(yǔ)法。它們和其他語(yǔ)言中常見(jiàn)的函數(shù)或之前介紹的函數(shù)定義方式有著很大的區(qū)別。那么在JavaScript中為什么能這么寫(xiě)?它所遵循的語(yǔ)法是什么呢?下面將介紹這些內(nèi)容。
認(rèn)識(shí)函數(shù)對(duì)象(Function Object)
可以用function關(guān)鍵字定義一個(gè)函數(shù),并為每個(gè)函數(shù)指定一個(gè)函數(shù)名,通過(guò)函數(shù)名來(lái)進(jìn)行調(diào)用。在JavaScript解釋執(zhí)行時(shí),函數(shù)都是被維護(hù)為一個(gè)對(duì)象,這就是要介紹的函數(shù)對(duì)象(Function Object)。
函數(shù)對(duì)象與其他用戶(hù)所定義的對(duì)象有著本質(zhì)的區(qū)別,這一類(lèi)對(duì)象被稱(chēng)之為內(nèi)部對(duì)象,例如日期對(duì)象(Date)、數(shù)組對(duì)象(Array)、字符串對(duì)象(String)都屬于內(nèi)部對(duì)象。這些內(nèi)置對(duì)象的構(gòu)造器是由JavaScript本身所定義的:通過(guò)執(zhí)行new Array()這樣的語(yǔ)句返回一個(gè)對(duì)象,JavaScript內(nèi)部有一套機(jī)制來(lái)初始化返回的對(duì)象,而不是由用戶(hù)來(lái)指定對(duì)象的構(gòu)造方式。
在JavaScript中,函數(shù)對(duì)象對(duì)應(yīng)的類(lèi)型是Function,正如數(shù)組對(duì)象對(duì)應(yīng)的類(lèi)型是Array,日期對(duì)象對(duì)應(yīng)的類(lèi)型是Date一樣,可以通過(guò)new Function()來(lái)創(chuàng)建一個(gè)函數(shù)對(duì)象,也可以通過(guò)function關(guān)鍵字來(lái)創(chuàng)建一個(gè)對(duì)象。為了便于理解,我們比較函數(shù)對(duì)象的創(chuàng)建和數(shù)組對(duì)象的創(chuàng)建。先看數(shù)組對(duì)象:下面兩行代碼都是創(chuàng)建一個(gè)數(shù)組對(duì)象myArray:
var myArray=[];
//等價(jià)于
var myArray=new Array();
同樣,下面的兩段代碼也都是創(chuàng)建一個(gè)函數(shù)myFunction:
function myFunction(a,b){
return a+b;
}
//等價(jià)于
var myFunction=new Function("a","b","return a+b");
通過(guò)和構(gòu)造數(shù)組對(duì)象語(yǔ)句的比較,可以清楚的看到函數(shù)對(duì)象本質(zhì),前面介紹的函數(shù)聲明是上述代碼的第一種方式,而在解釋器內(nèi)部,當(dāng)遇到這種語(yǔ)法時(shí),就會(huì)自動(dòng)構(gòu)造一個(gè)Function對(duì)象,將函數(shù)作為一個(gè)內(nèi)部的對(duì)象來(lái)存儲(chǔ)和運(yùn)行。從這里也可以看到,一個(gè)函數(shù)對(duì)象名稱(chēng)(函數(shù)變量)和一個(gè)普通變量名稱(chēng)具有同樣的規(guī)范,都可以通過(guò)變量名來(lái)引用這個(gè)變量,但是函數(shù)變量名后面可以跟上括號(hào)和參數(shù)列表來(lái)進(jìn)行函數(shù)調(diào)用。
用new Function()的形式來(lái)創(chuàng)建一個(gè)函數(shù)不常見(jiàn),因?yàn)橐粋€(gè)函數(shù)體通常會(huì)有多條語(yǔ)句,如果將它們以一個(gè)字符串的形式作為參數(shù)傳遞,代碼的可讀性差。下面介紹一下其使用語(yǔ)法: