您好,登錄后才能下訂單哦!
好程序員web前端學(xué)習(xí)路線分享函數(shù)基礎(chǔ),在這之前先來(lái)講一下函數(shù)是什么?
函數(shù)就一個(gè)代碼塊,可以是一個(gè)完全獨(dú)立與其它內(nèi)容沒有關(guān)系的代碼塊,也可以是一個(gè)與外界環(huán)境緊密相關(guān)的代碼塊。函數(shù)是一個(gè)擁有輸入和輸出的獨(dú)立代碼塊。函數(shù)是程序中最重要的組成部分。
函數(shù),是一種封裝(將一些語(yǔ)句,封裝到函數(shù)里面)。通過(guò)函數(shù)可以封裝任意多條語(yǔ)句,而且可以在任何地方、任何時(shí)候調(diào)用執(zhí)行。
在javascript里,函數(shù)即對(duì)象,程序可以隨意操控它們。函數(shù)可以嵌套在其他函數(shù)中定義,這樣它們就可以訪問(wèn)它們被定義時(shí)所處的作用域中的任何變量,它給javascript帶來(lái)了非常強(qiáng)勁的編程能力。
函數(shù)的功能、好處:
1) 將會(huì)被大量重復(fù)的語(yǔ)句寫在函數(shù)里面,這樣以后需要這些語(yǔ)句的時(shí)候,直接調(diào)用函數(shù),不用重寫那些語(yǔ)句。
2) 簡(jiǎn)化編程,讓編程變的模塊化。
函數(shù)的聲明
函數(shù)有三種聲明的方法,而且有各自不同的特點(diǎn)。
1、普通函數(shù)聲明
函數(shù)關(guān)鍵字 + 函數(shù)名 + (){
????????????????????????語(yǔ)句
????????????????????????函數(shù)體
????????} ??
例如:
???????????????
function functionName(){
????alert("程序員的搖籃");
???// ...語(yǔ)句//
}
注:1.函數(shù)命名跟變量一樣,只能是字母、數(shù)字、下劃線、美元符號(hào),不能以數(shù)字開頭。
2.后邊()里放參數(shù)用的
函數(shù)名的規(guī)范:
1、普通的函數(shù)使用,名稱需要駝峰式命名法,即函數(shù)是多個(gè)詞組構(gòu)成時(shí),第一個(gè)單詞的首字母小寫,其余的單詞首字母大寫。函數(shù)名不能與關(guān)鍵詞和保留字重復(fù),不能與變量名重復(fù)。
2、類的構(gòu)造函數(shù),是駝峰式命名,但是第一個(gè)單詞首字母需要大寫。
2、匿名函數(shù)聲明
var ?變量名稱 = function (){
??????函數(shù)內(nèi)容
}
var funName=function () {
????//函數(shù)內(nèi)容
};
定義一個(gè)匿名函數(shù),所謂匿名函數(shù)就是沒有函數(shù)名。但是匿名函數(shù)定義后如果不保存在一個(gè)變量中,就找不到了,因此,我們通常會(huì)用一個(gè)變量接收這個(gè)匿名函數(shù)。
匿名函數(shù)尾部結(jié)束時(shí)需要用;來(lái)結(jié)束,普通的函數(shù)結(jié)束后不用;結(jié)束的。
var funName=function abc() {
????//函數(shù)內(nèi)容
????console.log(abc);
}
匿名函數(shù)也是可以定義函數(shù)名稱的,只不過(guò)比的地方不能使用,只能在函數(shù)內(nèi)部使用。
3、Function構(gòu)造函數(shù)聲明
使用Function構(gòu)造函數(shù)
var box=new Function('num1','num2','retun num1+num2');//num1,num2參數(shù)
??num1,num2參數(shù), 最后的字符串是函數(shù)體
注意:第三種方式我們不推薦,因?yàn)檫@種語(yǔ)法會(huì)導(dǎo)致解析兩次代碼(第一次解析常規(guī)JS代碼,第二次是解析傳入構(gòu)造函數(shù)中的字符串),從而影響性能,但我們可以通過(guò)這種語(yǔ)法來(lái)理解函數(shù)是對(duì)象,函數(shù)名是指針的概念。
函數(shù)的存儲(chǔ)
JavaScript程序是一種解釋性語(yǔ)言。那么什么時(shí)候解釋性語(yǔ)言呢。
計(jì)算機(jī)其實(shí)并不認(rèn)識(shí)程序,不管是什么代碼計(jì)算機(jī)都不認(rèn)識(shí),因?yàn)橛?jì)算機(jī)只是機(jī)器,如果我們需要讓計(jì)算機(jī)認(rèn)識(shí)程序,那么就需要一個(gè)翻譯,就是把程序代碼變成計(jì)算機(jī)可以理解的語(yǔ)言:0和1的信息序列。目前存在兩種翻譯類型:一個(gè)是編譯,一個(gè)是解釋。兩種方式都需要對(duì)代碼進(jìn)行翻譯,只是翻譯的時(shí)間不同而已。
編譯型語(yǔ)言在計(jì)算機(jī)運(yùn)行代碼前,先把代碼翻譯成計(jì)算機(jī)可以理解的文件,這種文件計(jì)算機(jī)就能看懂了,但是不管是程序員還是其他人員都看不懂的。并且這種代碼,計(jì)算機(jī)可以執(zhí)行了,但是每次我們需要修改代碼時(shí)都需要修改源代碼,然后再進(jìn)行編譯新的文件才可以使用,也就是不能再編譯好的文件上修改。這種代碼的優(yōu)勢(shì)是運(yùn)行速度快,在執(zhí)行前就知道代碼是否錯(cuò)誤,因?yàn)榫幾g時(shí)就做了判斷。
解釋型語(yǔ)言則不同,解釋型語(yǔ)言的程序不需要在運(yùn)行前編譯,在運(yùn)行程序的時(shí)候才翻譯,專門的解釋器負(fù)責(zé)在每個(gè)語(yǔ)句執(zhí)行的時(shí)候解釋程序代碼。這樣解釋型語(yǔ)言每執(zhí)行一次就要翻譯一次,效率比較低。而且執(zhí)行時(shí)才知道代碼是否錯(cuò)誤。
而JavaScript就是解釋性語(yǔ)言。但是注意程序在運(yùn)行的時(shí)候,解釋器首先會(huì)收集所有的普通定義的函數(shù),并且把他們存儲(chǔ)在堆里,這時(shí)候才從頭開始執(zhí)行代碼。
abc();
function abc() {
???
}
例如我們看到這里abc的執(zhí)行在函數(shù)的上面,如果按照代碼的執(zhí)行順序,應(yīng)該先執(zhí)行abc,再創(chuàng)造函數(shù),那么顯然就會(huì)報(bào)錯(cuò)。但是這樣不會(huì)有問(wèn)題。就是說(shuō)明,函數(shù)首先會(huì)被收集在堆里,不管在哪里調(diào)用,都是調(diào)用堆里的函數(shù),因此普通定義的函數(shù)執(zhí)行時(shí)可以寫在前面或者寫在后面。
但是注意如果我們使用匿名函數(shù)這種情況就不同了。雖然我們會(huì)收集匿名函數(shù)在堆里,但是如果找到它時(shí),我們就需要在把它賦給一個(gè)變量以后才可以執(zhí)行,否則就會(huì)報(bào)錯(cuò)。
abc();
var abc=function () {
???
}
這是錯(cuò)誤的。
例如上面這種就是錯(cuò)誤的。
函數(shù)的參數(shù)
參數(shù)是指由外部傳入到函數(shù)中的變量,僅作為變量使用,但是該變量可以是任何內(nèi)容,包括函數(shù)。
被傳入的參數(shù)作為局部變量使用,可以被覆蓋掉。
參數(shù)就是一個(gè)局部變量,通過(guò)外界傳入值,這個(gè)參數(shù)就是對(duì)應(yīng)的值。參數(shù)是按照順序填入的。參數(shù)在JavaScript中不要求寫入?yún)?shù)的類型和默認(rèn)值,如果需要默認(rèn)值,就需要在函數(shù)中,根據(jù)條件判斷增加默認(rèn)的值。有時(shí)候我們可以不用定義參數(shù),直接在函數(shù)調(diào)用時(shí),帶入?yún)?shù),也可以獲取到。(不建議大家使用)
為什么要從外部帶入?yún)?shù)。一般來(lái)說(shuō)函數(shù)是獨(dú)立處理某段代碼的集合,如果,這段代碼需要重復(fù)執(zhí)行,就會(huì)設(shè)計(jì)出函數(shù),在不同的地方調(diào)用,達(dá)到代碼共用的目的,減少代碼量。但是在某些時(shí)候,雖然是同樣的代碼,但是我們需要它發(fā)揮出的作用更大,可以解決不同的問(wèn)題,這時(shí)候,傳入的參數(shù)就可以起到代碼干預(yù)作用,在同一個(gè)函數(shù)中解決了很多不同的問(wèn)題。這時(shí)候設(shè)計(jì)函數(shù)的獨(dú)立性就顯得非常重要了。當(dāng)然,任何事情解決都不是絕對(duì)的,過(guò)度設(shè)計(jì)復(fù)雜的函數(shù)有時(shí)候反到會(huì)讓代碼效率降低。
????????同時(shí),外部傳入的參數(shù)可以節(jié)省全局變量的定義,甚至保證函數(shù)中的部分變量的獨(dú)立性。
參數(shù)分為實(shí)參和形參。
實(shí)參:真實(shí)的數(shù)值、字符串
形參:一個(gè)接收實(shí)參的變量
例如這里是通過(guò)一個(gè)函數(shù)中的參數(shù)來(lái)控制在頁(yè)面上添加多少個(gè)li
var m=5;
createUl(m);
function createUl(n) {
????if(n<1 || isNaN(n)) n=1;
????var ul="<ul>";
????for(var i=0;i<n;i++){
????????ul+="<li>列表"+(i+1)+"</li>";
????}
????ul+="</ul>";
????document.write(ul);
}
函數(shù)的返回值
return 語(yǔ)句會(huì)終止函數(shù)的執(zhí)行并返回函數(shù)的值。return 是javascript里函數(shù)返回值的關(guān)鍵字,一個(gè)函數(shù)內(nèi)處理的結(jié)果可以使用return 返回,這樣在調(diào)用函數(shù)的地方就可以用變量接收返回結(jié)果。return 關(guān)鍵字內(nèi)任何類型的變量數(shù)據(jù)或表達(dá)式都可以進(jìn)行返回,甚至什么都不返回也可以
abc(3,5);
function abc(a,b){
???return a+b;
}
注意return只能返回一個(gè)值,如果需要返回多個(gè)數(shù)據(jù)時(shí)可以考慮數(shù)組或者對(duì)象,例如
function abc() {
????return {a:1,b:2};
}
return 也可以作為阻止后續(xù)代碼執(zhí)行的語(yǔ)句被使用,例如
var bool=false;
var i=0;
function abc(){
????if(bool) return;
????i++;
}
這樣可以有效的控制語(yǔ)句在一定的條件下執(zhí)行,不過(guò)一定要與break區(qū)分,break是用在條件當(dāng)中,跳出的也僅僅是條件和循環(huán),但是return 卻可以跳出函數(shù),僅僅是針對(duì)函數(shù)使用,如果沒有函數(shù)是不能使用return的。
abc();
function abc() {
????for(var i=0;i<10;i++){
????????if(i===3){
????????????// break;
????????????return;
????????}
????}
????i+=5;
????console.log(i);//i=8
}例如上面的例子,如果使用break,就會(huì)打印i的值是8,如果使用return,就不會(huì)打印了,因?yàn)閞eturn直接跳出了函數(shù)。
函數(shù)的執(zhí)行
函數(shù)的執(zhí)行分為兩種
1、普通函數(shù)執(zhí)行
函數(shù)執(zhí)行 :函數(shù)名()
執(zhí)行后,可以完成函數(shù)的代碼內(nèi)容,如果函數(shù)內(nèi)有return 值,這時(shí)候執(zhí)行后會(huì)返回該值。
function abc() {
????return 3+4;
}
var s=abc();
如何沒有return,則執(zhí)行完所有代碼
2、函數(shù)獨(dú)立執(zhí)行
函數(shù)自身是可以獨(dú)立執(zhí)行的,并且也可以把獨(dú)立執(zhí)行的結(jié)果賦值給一個(gè)變量。
var s=0;
(function(){
????s=4+5
})();
左邊是匿名函數(shù)自己執(zhí)行,右邊是匿名函數(shù)賦值
注意匿名函數(shù)用小括號(hào)括住,最后再執(zhí)行小括號(hào)。
注意,除了匿名函數(shù)可以獨(dú)立執(zhí)行,實(shí)名函數(shù)也是可以獨(dú)立執(zhí)行的,不過(guò)這種獨(dú)立執(zhí)行就不能在該函數(shù)中添加參數(shù)了,并且匿名函數(shù),也只能在此執(zhí)行一次,不能多次調(diào)用,顯而易見的好處是,該函數(shù)內(nèi)的變量統(tǒng)統(tǒng)是私有變量,有關(guān)該部分內(nèi)容我們?cè)诤竺嬖敿?xì)說(shuō)明
函數(shù)的刪除
當(dāng)函數(shù)不在使用時(shí),就需要?jiǎng)h除,函數(shù)也是對(duì)象,如果不刪除,它將常駐內(nèi)存中,如果該函數(shù)不再使用就可以使用刪除徹底清除掉該函數(shù)。但是只有函數(shù)是匿名定義的或者通過(guò)構(gòu)造函數(shù)創(chuàng)建的才可以被刪除。
函數(shù)刪除分兩種
1、匿名函數(shù)刪除
函數(shù)=null
2、對(duì)象下函數(shù)刪除
delete obj.fun
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。