2021-03-27

新手小白對(duì)回調(diào)函數(shù)的理解

只是寫(xiě)寫(xiě)自己的理解庆尘,借鑒了網(wǎng)上的一些文章剃诅,歡迎指正!

1.什么是函數(shù)

? ? ? ?要了解回調(diào)函數(shù)驶忌,就必須先了解函數(shù)矛辕。那么笑跛,什么是函數(shù)呢?

? ? ? ?如果要多處實(shí)現(xiàn)某個(gè)功能聊品,不用函數(shù)的話(huà)就要寫(xiě)很多次飞蹂,增加代碼量,浪費(fèi)時(shí)間翻屈;如果要修改這個(gè)功能陈哑,那就要多處修改,非常不方便伸眶。使用函數(shù)可以減少代碼量惊窖,方便后期修改。

? ? ? ?在JavaScript 中定義函數(shù)的方法有 3 種厘贼,即使用 function 語(yǔ)句爬坑、使用 Function() 構(gòu)造函數(shù)和定義函數(shù)直接量。

? ? ?(1)使用 function 語(yǔ)句聲明函數(shù)涂臣。具體用法如下:

? ? ? ? ? ? function onDeleteMail ( [args] ) {

? ? ? ? ? ? ? ? ? ? //statements

? ? ? ? ? ? }

? ? ? ?onDeleteMail 是函數(shù)名盾计,與變量名一樣必須是 JavaScript 合法的標(biāo)識(shí)符。在函數(shù)名之后是一個(gè)由一個(gè)小括號(hào)包含的參數(shù)列表赁遗,參數(shù)之間以逗號(hào)分隔署辉。參數(shù)是可選的,沒(méi)有數(shù)量限制岩四。

? ? ? ? 作為標(biāo)識(shí)符哭尝,參數(shù)僅在函數(shù)體內(nèi)被訪(fǎng)問(wèn),參數(shù)是函數(shù)作用域的私有成員剖煌。調(diào)用函數(shù)時(shí)材鹦,通過(guò)為函數(shù)傳遞值,然后使用參數(shù)獲取外部傳入的值耕姊,并在函數(shù)體內(nèi)干預(yù)函數(shù)的運(yùn)行桶唐。

? ? ? ? 在小括號(hào)之后是一個(gè)大括號(hào),大括號(hào)內(nèi)包含的語(yǔ)句就是函數(shù)體結(jié)構(gòu)的主要內(nèi)容茉兰,大括號(hào)是必不可少的尤泽,缺少大括號(hào),JavaScript 將會(huì)拋出語(yǔ)法錯(cuò)誤规脸。

? ? ? ?function 語(yǔ)句必須包含函數(shù)名坯约、小括號(hào)和大括號(hào),其他代碼都可省略莫鸭,因此最簡(jiǎn)單的函數(shù)體是一個(gè)空函數(shù)闹丐。

? ? ? ? ? ? ? ? function ?onDeleteMail( ) { }? //空函數(shù)

? ? ? ? 如果使用匿名函數(shù),則可以省略函數(shù)名被因。

? ? ? ? ? ? ? ? ?function ( ) { }? //匿名空函數(shù)

? ? ? ? var 語(yǔ)句和 function 語(yǔ)句都是聲明語(yǔ)句卿拴,它們聲明的變量和函數(shù)都在 JavaScript 預(yù)編譯時(shí)被解析衫仑,也被稱(chēng)為變量提升和函數(shù)提升。在預(yù)編譯期巍棱,JavaScript 引擎會(huì)為每個(gè) function 創(chuàng)建上下文惑畴,定義變量對(duì)象,同時(shí)把函數(shù)內(nèi)所有形參航徙、私有變量如贷、嵌套函數(shù)作為屬性注冊(cè)到變量對(duì)象上。

? ? ? (2)Function() 構(gòu)造函數(shù)// 此方法并不常用

? ? ? ? 使用 Function( ) 構(gòu)造函數(shù)可以快速生成函數(shù)到踏。具體用法如下:

? ? ? ? ?var? boy = new Function (p1 , p2 , ... , pn , body) ;

? ? ? ? Function( ) 的參數(shù)類(lèi)型都是字符串杠袱,p1~pn 表示所創(chuàng)建函數(shù)的參數(shù)名稱(chēng)列表,body 表示所創(chuàng)建函數(shù)的函數(shù)結(jié)構(gòu)體語(yǔ)句窝稿,在 body 語(yǔ)句之間以分號(hào)分隔楣富。

? ? ? ? ?使用 Function( ) 構(gòu)造函數(shù)可以不指定任何參數(shù),創(chuàng)建一個(gè)空函數(shù)結(jié)構(gòu)體伴榔。

? ? ? ? ? ? ?var f = new Function( ); //定義空函數(shù)

? ? ? ?使用 Function() 構(gòu)造函數(shù)可以動(dòng)態(tài)的創(chuàng)建函數(shù)纹蝴,它不會(huì)把用戶(hù)限制在 function 語(yǔ)句預(yù)聲明的函數(shù)體中。使用 Function() 構(gòu)造函數(shù)能夠把函數(shù)當(dāng)做表達(dá)式來(lái)使用踪少,而不是當(dāng)做一個(gè)結(jié)構(gòu)塘安,因此使用起來(lái)會(huì)更靈活。其缺點(diǎn)就是援奢,F(xiàn)unction() 構(gòu)造函數(shù)在執(zhí)行期被編譯兼犯,執(zhí)行效率非常低,一般不推薦使用集漾。

? ? (3)匿名函數(shù)(函數(shù)直接量)

? ? ? ?函數(shù)直接量也稱(chēng)為匿名函數(shù)切黔,即函數(shù)沒(méi)有函數(shù)名,僅包含 function 關(guān)鍵字具篇、參數(shù)和函數(shù)體纬霞。具體用法如下:

? ? ? ? ? ? ?function ( [args] ) {

? ? ? ? ? ? ? ? ? ? ? ? ?// statements

? ? ? ? ? ? ? }

? ? ? ? ?示例1:

? ? ? ? 下面代碼定義一個(gè)函數(shù)直接量。

? ? ? ? ? ? ? //函數(shù)直接量

? ? ? ? ? ? ? function ( a , b ){

? ? ? ? ? ? ? ? ? ?return a+b;

? ? ? ? ? ? ? ?}

? ? ? ? 在上面代碼中栽连,函數(shù)直接量與使用 function 語(yǔ)句定義函數(shù)結(jié)構(gòu)基本相同险领,它們的結(jié)構(gòu)都是固定的。但是函數(shù)直接量沒(méi)有指定函數(shù)名秒紧,而是直接利用關(guān)鍵字 function 來(lái)表示函數(shù)的結(jié)構(gòu),這種函數(shù)也被稱(chēng)為匿名函數(shù)挨下。

? ? ? ?示例2:

? ? ? ?匿名函數(shù)就是一個(gè)表達(dá)式熔恢,即函數(shù)表達(dá)式,而不是函數(shù)結(jié)構(gòu)的語(yǔ)句臭笆。下面把匿名函數(shù)作為一個(gè)值賦值給變量 f叙淌。

? ? ? ? ?//把函數(shù)作為一個(gè)值直接賦值給變量 f

? ? ? ? ? var? f = function ( a, b){

? ? ? ? ? ? ? return a+b;

? ? ? ? ? };

? ? ? ? 當(dāng)把函數(shù)結(jié)構(gòu)作為一個(gè)值賦值給變量之后秤掌,變量就可以作為函數(shù)被調(diào)用,此時(shí)變量就指向那個(gè)匿名函數(shù)鹰霍。

? ? ? ? console.log ( f ( 1,2 ) );? //返回值3

? ? ? ?示例3:

? ? ? ?匿名函數(shù)作為值闻鉴,可以參與更復(fù)雜的表達(dá)式運(yùn)算。針對(duì)上面示例可以使用以下代碼完成函數(shù)定義和調(diào)用一體化操作茂洒。

? ? ? ?//把函數(shù)作為一個(gè)操作數(shù)進(jìn)行調(diào)用

? ? ? ? ?console.log(?

? ? ? ? ? ? ? ? ( function(a,b) {

? ? ? ? ? ? ? ? ? ? ? ? ?return a+ b;

? ? ? ? ? ? ? ? })(1,2));? //返回?cái)?shù)值3

? ? ?(4)定義嵌套函數(shù)

? ? ? ?JavaScript 允許函數(shù)相互嵌套孟岛,因此可以定義復(fù)雜的嵌套結(jié)構(gòu)函數(shù)。

? ? ? ?示例1:

? ? ? ?使用 function 語(yǔ)句聲明兩個(gè)相互嵌套的函數(shù)體結(jié)構(gòu)督勺。

? ? ? ? ? ? function? f (x,y) {? //外層函數(shù)

? ? ? ? ? ? ? ? ? ? ?functione (a,b){? ?//內(nèi)層函數(shù)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? return? a*b ;

? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? return? x+y;

? ? ? ? ? ?}

? ? ? ? ?示例2:

? ? ? ? ? ? ? ?嵌套的函數(shù)只能在函數(shù)體內(nèi)可見(jiàn)渠羞,函數(shù)外不允許直接訪(fǎng)問(wèn)、調(diào)用智哀。

? ? ? ? ? ? ? ? function? f (x,y) {

? ? ? ? ? ? ? ? ? ? ? ?function? ?e (a,b) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?return? a*b;

? ? ? ? ? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ? ? ? ? return? ?e (3, 6) + y;? ? //內(nèi)層函數(shù)參與表達(dá)式運(yùn)算有效

? ? ? ? ? ? ? ? ? ? ? console.log? (e (3,6) );? //無(wú)效的調(diào)用

? ? ? ? ? ? ? }

? ? ? ? ? ? ?console.log ( f (3,6) ) ;? ? //調(diào)用外層函數(shù)

2.什么是回調(diào)函數(shù)

? ? ? ?回調(diào)函數(shù)就是一個(gè)被作為參數(shù)傳遞給另一個(gè)函數(shù)次询,回調(diào)函數(shù)早另一個(gè)函數(shù)中被調(diào)用。眾所周知瓷叫,函數(shù)被大量使用的原因即為:一段代碼需要被多處調(diào)用屯吊,將此段代碼封裝至一個(gè)函數(shù)體內(nèi),可在多處調(diào)用摹菠,減少代碼量盒卸。而回調(diào)函數(shù)是為了解決多處調(diào)用時(shí),后續(xù)操作的不同辨嗽。比如說(shuō)世落,周五了老師給同學(xué)們布置作業(yè),老師可以選擇分別給每一個(gè)同學(xué)布置一遍作業(yè)糟需,也可以將同學(xué)們聚到一起屉佳,一次就把作業(yè)布置完成。這就像一個(gè)函數(shù)洲押,封裝一次武花,多次使用。但是老師把作業(yè)布置好以后杈帐。每個(gè)學(xué)生會(huì)用自己的方式完成体箕,可能有些學(xué)生周五全部寫(xiě)完,有些同學(xué)攢到周天才寫(xiě)作業(yè)挑童,這就是回調(diào)函數(shù)累铅。

? ? ? ?那么什么時(shí)候回調(diào)函數(shù)會(huì)進(jìn)行調(diào)用嗎?

? ? ? ?① 發(fā)生事件時(shí)站叼,例如娃兽,用戶(hù)單擊按鈕,或者用戶(hù)從下拉列表中選擇某些選項(xiàng)等等尽楔。

? ? ? ? 示例:DOM事件回調(diào)函數(shù)

? ? ? ? ? documet . getElementById ('btn') .onclick = function( ){

? ? ? ? ? ? ? ? ?alert? 'hello world' ;

? ? ? ? ? };

? ? ? ② 定時(shí)器回調(diào)函數(shù)

? ? ? ? ?setTimeout? ( function( ){

? ? ? ? ? ? ? ? console.log('兩秒過(guò)去了');

? ? ? ? ?} , 2000? );

? ??

??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末投储,一起剝皮案震驚了整個(gè)濱河市第练,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌玛荞,老刑警劉巖娇掏,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異勋眯,居然都是意外死亡婴梧,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)凡恍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)志秃,“玉大人,你說(shuō)我怎么就攤上這事嚼酝「』梗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵闽巩,是天一觀的道長(zhǎng)钧舌。 經(jīng)常有香客問(wèn)我,道長(zhǎng)涎跨,這世上最難降的妖魔是什么洼冻? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮隅很,結(jié)果婚禮上撞牢,老公的妹妹穿的比我還像新娘。我一直安慰自己叔营,他們只是感情好屋彪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著绒尊,像睡著了一般畜挥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上婴谱,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天蟹但,我揣著相機(jī)與錄音,去河邊找鬼谭羔。 笑死华糖,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瘟裸。 我是一名探鬼主播缅阳,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼景描!你這毒婦竟也來(lái)了十办?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤超棺,失蹤者是張志新(化名)和其女友劉穎向族,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體棠绘,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡件相,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了氧苍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夜矗。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖让虐,靈堂內(nèi)的尸體忽然破棺而出紊撕,到底是詐尸還是另有隱情,我是刑警寧澤赡突,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布对扶,位于F島的核電站,受9級(jí)特大地震影響惭缰,放射性物質(zhì)發(fā)生泄漏浪南。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一漱受、第九天 我趴在偏房一處隱蔽的房頂上張望络凿。 院中可真熱鬧,春花似錦昂羡、人聲如沸絮记。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)到千。三九已至,卻和暖如春赴穗,著一層夾襖步出監(jiān)牢的瞬間憔四,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工般眉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留了赵,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓甸赃,卻偏偏與公主長(zhǎng)得像柿汛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Vue核心概念 vue實(shí)例化 虛擬dom 模板編譯 數(shù)據(jù)綁定(響應(yīng)式) 組件化 MVVM model和view層通...
    斗伽閱讀 808評(píng)論 0 12
  • 方法 在一個(gè)對(duì)象中綁定函數(shù)络断,稱(chēng)為這個(gè)對(duì)象的方法裁替。 在JavaScript中,對(duì)象的定義是這樣的: 但是貌笨,如果我們給...
    wit92閱讀 455評(píng)論 0 0
  • 前面的話(huà) 函數(shù)是所有編程語(yǔ)言的重要組成部分弱判,在ES6出現(xiàn)前,JS的函數(shù)語(yǔ)法一直沒(méi)有太大的變化锥惋,從而遺留了很多問(wèn)題昌腰,...
    CodeMT閱讀 825評(píng)論 0 1
  • Python #for循環(huán) 計(jì)數(shù)循環(huán) #i是代表接受到字符串遍歷出來(lái)的每一個(gè)元素 #'python'是可迭代對(duì)象 ...
    70e85f2a51b8閱讀 71評(píng)論 0 0
  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友膀跌。感恩相遇遭商!感恩不離不棄。 中午開(kāi)了第一次的黨會(huì)捅伤,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,567評(píng)論 0 11