前幾天有間單提到該如何聲明函式及在Hositing中會發生什麼事,可是函式的奧妙不只於此。算法
身爲一個使用JS的工程師,咱們必定要熟悉函式到比戀人還熟!數組
這幾天將會把函式逐一扒開跟各位一塊兒探討其中的奧妙。瀏覽器
函式是頭等物件服務器
這句話表明着函式與任何JS物件共存,也被當成一個物件。less
函式能夠被當成變量引用、用實值做聲明,或是做爲函式參數傳遞。性能
這個咱們在前幾天雖然有提到,但並無說爲何函式能夠這樣做,今天就有說明到是由於頭等物件所形成的,也讓你們複習一下:事件
//實質創建ip
function myFun(){}開發
//指派給變量、數組或其餘物件屬性get
var myFun = function(){};
var myArr = [];
myArr.push(function(){});
var myObj = {};
myObj.funA = function(){};
//做爲參數傳遞給其餘函式
function myFun(val){
val();
}
myFun(function(){});
//做爲函式的回傳值
function myFun(){
return function(){}
}
//動態創建和指派屬性
var myFun = function(){};
myFun.data =「Hola」;
回呼函式Callback function
頭等物件的其中同樣特性,能夠做爲參數傳遞給函式,而在某個時間點,可能會呼叫這個被傳入的函式,這就是「回呼函式」的概念。
每當咱們設置一個準備在以後呼叫的函式,不管是透過瀏覽器的事件處理階段或是透過其餘代碼,這個行爲就是在設置一個回呼函式。咱們能夠這樣解釋:這個被創建的函式,會在稍候某個適當的時機點,由其餘代碼「回呼」(call back)。
這會或仍是有點難以理解,不過你或許已經使用過回呼函式只是你不知道而已,不管是最簡單的按鈕按下執行程序仍是從服務器接收數據,這都是回呼函式!
咱們來看一個最簡單的示例:
var text = 'get Text';
function unlessFun(callback){
console.log('In unlessFUn');
return callback();
}
function getText(){
console.log('In getTxt function');
return text;
}
unlessFun(getText);
執行後會獲得以下圖:
或許你認爲我直接在unlessFun裏面印出text就行了啊,爲何要用回呼函式畫蛇添足。
那也許接下來這個示例會讓你體驗到回呼函式的美好:
若是咱們今天有一組數字[2,1,6,12,3,77,100,4]須要作比較大小,這時候可能不少人就會開始本身寫個算法的函式,像是這樣:
var arr = [2,1,6,12,3,77,100,4];
function compare(val){
for(let i = 0;i<val.lenght;i++){
…
}
}
也許你花了好幾天終於寫出了這個算法,可是其實咱們能夠發現JS早就幫你寫好了一個sort()函式,
你能夠拿來用,只須要寫好回呼函式:
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]
咱們不須要考慮算法的底層細節,JS早就針對這些算法函式進行最佳化了,沒有必要重複造輪子並且造出來的性能還不必定比較好,因此學好回呼函式並使用他們吧!
參考資料:
忍者Javascript開發技巧探討