javascript
学习JS的心路历程-函式(一)
前幾天有間單提到該如何聲明函式及在Hositing中會(huì)發(fā)生什么事,但是函式的奧妙不僅于此。
?
身為一個(gè)使用JS的工程師,我們一定要熟悉函式到比戀人還熟!
?
這幾天將會(huì)把函式逐一扒開(kāi)跟各位一起探討其中的奧妙。
?
函式是頭等物件
這句話代表著函式與任何JS物件共存,也被當(dāng)成一個(gè)物件。
函式可以被當(dāng)成變量引用、用實(shí)值作聲明,或是作為函式參數(shù)傳遞。
?
這個(gè)我們?cè)谇皫滋祀m然有提到,但并沒(méi)有說(shuō)為什么函式可以這樣作,今天就有說(shuō)明到是因?yàn)轭^等物件所造成的,也讓大家復(fù)習(xí)一下:
?
//實(shí)質(zhì)建立
function myFun(){}
?
//指派給變量、數(shù)組或其他物件屬性
var myFun = function(){};
?
var myArr = [];
myArr.push(function(){});
?
var myObj = {};
myObj.funA = function(){};
?
//作為參數(shù)傳遞給其他函式
function myFun(val){
val();
}
myFun(function(){});
?
//作為函式的回傳值
function myFun(){
return function(){}
}
?
//動(dòng)態(tài)建立和指派屬性
var myFun = function(){};
myFun.data =“Hola”;
回呼函式Callback function
頭等物件的其中一樣特性,可以作為參數(shù)傳遞給函式,而在某個(gè)時(shí)間點(diǎn),可能會(huì)呼叫這個(gè)被傳入的函式,這就是「回呼函式」的概念。
?
每當(dāng)我們?cè)O(shè)置一個(gè)準(zhǔn)備在之后呼叫的函式,不論是透過(guò)瀏覽器的事件處理階段或是透過(guò)其他代碼,這個(gè)行為就是在設(shè)置一個(gè)回呼函式。我們可以這樣解釋:這個(gè)被建立的函式,會(huì)在稍候某個(gè)適當(dāng)?shù)臅r(shí)機(jī)點(diǎn),由其他代碼「回呼」(call back)。
?
這會(huì)或還是有點(diǎn)難以理解,不過(guò)你或許已經(jīng)使用過(guò)回呼函式只是你不知道而已,不論是最簡(jiǎn)單的按鈕按下執(zhí)行程序還是從服務(wù)器接收數(shù)據(jù),這都是回呼函式!
?
我們來(lái)看一個(gè)最簡(jiǎn)單的示例:
?
var text = 'get Text';
function unlessFun(callback){
console.log('In unlessFUn');
return callback();
}
function getText(){
console.log('In getTxt function');
return text;
}
unlessFun(getText);
執(zhí)行后會(huì)得到如下圖:
?
或許你認(rèn)為我直接在unlessFun里面印出text就好了啊,為什么要用回呼函式多此一舉。
那也許接下來(lái)這個(gè)示例會(huì)讓你體驗(yàn)到回呼函式的美好:
?
如果我們今天有一組數(shù)字[2,1,6,12,3,77,100,4]需要做比較大小,這時(shí)候可能很多人就會(huì)開(kāi)始自己寫(xiě)個(gè)算法的函式,像是這樣:
?
var arr = [2,1,6,12,3,77,100,4];
function compare(val){
for(let i = 0;i<val.lenght;i++){
…
}
}
也許你花了好幾天終于寫(xiě)出了這個(gè)算法,但是其實(shí)我們可以發(fā)現(xiàn)JS早就幫你寫(xiě)好了一個(gè)sort()函式,
你可以拿來(lái)用,只需要寫(xiě)好回呼函式:
?
var arr = [2,1,6,12,3,77,100,4];
arr.sort(function(a,b){
return a - b;
});
console.log(arr);//[1,2,3,4,6,12,77,100]
我們不需要考慮算法的底層細(xì)節(jié),JS早就針對(duì)這些算法函式進(jìn)行最佳化了,沒(méi)有必要重復(fù)造輪子而且造出來(lái)的性能還不一定比較好,所以學(xué)好回呼函式并使用他們吧!
?
參考資料:
忍者Javascript開(kāi)發(fā)技巧探討
轉(zhuǎn)載于:https://www.cnblogs.com/lannyQ-Q/p/9920555.html
總結(jié)
以上是生活随笔為你收集整理的学习JS的心路历程-函式(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 传神成进博会唯一指定智能翻译硬件提供商
- 下一篇: 几种常见的消息队列