1,“函數(shù)對(duì)于任何語(yǔ)言來(lái)說都是一個(gè)核心概念。通過函數(shù)可以封裝任意多條語(yǔ)句,而且可以在任何地方任何時(shí)候調(diào)用執(zhí)行。ECMAScript中的函數(shù)使用function關(guān)鍵字來(lái)進(jìn)行聲明,后跟一組參數(shù)以及函數(shù)體。”
function sayHi(name,message){
alert("Hello,"+name+","+message);
}
var name1="Lilei";
var message1="look how they shine for you!";
sayHi(name1,message1);
2,“js中的函數(shù)在定義時(shí)不需要指定是否有返回值。實(shí)際上,任何函數(shù)任何時(shí)候都可以通過return語(yǔ)句后面跟要返回的值來(lái)實(shí)現(xiàn)返回值。”
3,“ECMAScript函數(shù)的參數(shù)與大多數(shù)其他語(yǔ)言的參數(shù)有所不同。ECMAScript函數(shù)并不介意傳遞進(jìn)來(lái)多少個(gè)參數(shù),也不在乎傳來(lái)的的參數(shù)是什么數(shù)據(jù)類型。也就是說,即便你定義的函數(shù)只接受兩個(gè)參數(shù),在調(diào)用這個(gè)函數(shù)時(shí)也未必一定要傳遞兩個(gè)參數(shù)。可以傳遞一個(gè),三個(gè)甚至不傳遞參數(shù),而解析器永遠(yuǎn)不會(huì)有什么怨言(這解析器脾氣真好)。之所以會(huì)這樣,原因是ECMAScript中的參數(shù)在內(nèi)部是用一個(gè)數(shù)組來(lái)表示的。函數(shù)接收到的始終是這個(gè)數(shù)組,而不關(guān)心數(shù)組中包含哪些參數(shù)(如果有參數(shù)的話)。如果這個(gè)數(shù)組中不包含任何元素,無(wú)所謂;如果包含多個(gè)元素,也沒有問題。實(shí)際上,在函數(shù)體內(nèi)就可以通過arguments對(duì)象來(lái)訪問和這個(gè)參數(shù)數(shù)組。從而獲取傳遞給函數(shù)的每一個(gè)參數(shù)。其實(shí),arguments對(duì)象只是與數(shù)組類似(它并不是Array的實(shí)例),因?yàn)榭梢允褂梅嚼ㄌ?hào)語(yǔ)法訪問它的每一個(gè)元素,使用length屬性來(lái)確定傳遞進(jìn)來(lái)多少個(gè)參數(shù)。在前面的例子中,sayHi()函數(shù)的第一個(gè)參數(shù)的名字叫做name,而該參數(shù)的值也可以通過訪問arguments[0]來(lái)獲取。”
4,對(duì)于js函數(shù)來(lái)說,命名的參數(shù)只提供便利,并不是必須的。
function sayHi(){
alert("Hello"+arguments[0]+","+arguments[1]);
}
5,可以在函數(shù)體內(nèi)部對(duì)函數(shù)的參數(shù)進(jìn)行重寫。
function doAdd(){
if(arguments.length ==1){
alert(arguments[0]+10);
}else if(arguments.length==2){
alert(arguments[0]+arguments[1]);
}else(
alert("參數(shù)個(gè)數(shù)大于兩個(gè)了。")
)
}
doAdd(10);
doAdd(23,39);
doAdd(23,34,123);
6,“關(guān)于arguments的行為,還有一點(diǎn)比較有意思的是,它的值永遠(yuǎn)與對(duì)應(yīng)命名參數(shù)的值保持同步。”
function add(num1,num2){
arguments[1]=100;
window.console.info("兩個(gè)參數(shù)之和為:"+(arguments[0]+arguments[1]));
}
add(352,4678);
7,“ECAMScript函數(shù)不能像傳統(tǒng)意義上那樣實(shí)現(xiàn)重載。而在其他語(yǔ)言中,可以為一個(gè)函數(shù)編寫兩個(gè)定義,只要這兩個(gè)定義的簽名(接受的參數(shù)類型和數(shù)量)不同即可。如前所述,ECMAScript函數(shù)沒有簽名,因?yàn)槠鋮?shù)是由包含零或者多個(gè)值得數(shù)組來(lái)表示的,而沒有函數(shù)簽名,真正意義上的重載是不可能做到的。”
如果我們編寫了兩個(gè)名字和參數(shù)個(gè)數(shù)一樣的函數(shù),則后面寫的函數(shù)會(huì)覆蓋掉前面的函數(shù)。
function addSomeNumber(num){
return num+100;
}
function addSomeNumber(num){
return num+200;
}
window.console.info(addSomeNumber(100));
8,小結(jié)
a,js中的基本數(shù)據(jù)類型包括:Undefined,Null,Boolean,Number,String。
b,與其他語(yǔ)言不同,js沒有為整數(shù)和浮點(diǎn)數(shù)值分別定義不同的數(shù)據(jù)類型,Number類型可用于表示所有數(shù)值。
c,js中也有一種復(fù)雜的數(shù)據(jù)類型,即Object類型,該類型是這門語(yǔ)言中所有對(duì)象的基礎(chǔ)類型。
d,嚴(yán)格模式為這門語(yǔ)言容易出錯(cuò)的地方施加了限制。
e,js提供了很多與c以及其他類c語(yǔ)言中相同的基本操作符,包括算術(shù)操作符,布爾操作符,關(guān)系操作符,相等操作符以及賦值操作符等。
f,js從其他語(yǔ)言借鑒了很多流程控制語(yǔ)句,例如if語(yǔ)句,for語(yǔ)句和switch語(yǔ)句等,js中的函數(shù)與其他語(yǔ)言中的函數(shù)有很多不同的地方,特別最參數(shù)的理解上。
g,js無(wú)需指定函數(shù)的煩hi之,因?yàn)槿魏蝚s函數(shù)都可以在任何時(shí)候返回任何值。未指定返回值的函數(shù)返回的是一個(gè)特殊的undefined值。
h,js中的函數(shù)沒有函數(shù)簽名的概念,因?yàn)槠浜瘮?shù)參數(shù)是以一個(gè)包含零或者多個(gè)值得數(shù)組的形式傳遞的。
i,可以向js函數(shù)傳遞任意數(shù)量的參數(shù),并且可以通過arguments對(duì)象來(lái)訪問這些參數(shù)。
j,由于不存在函數(shù)簽名的特性,js函數(shù)不能重載。
本節(jié)源碼下載地址:JavaScript學(xué)習(xí)筆記(4):函數(shù)