一個(gè)關(guān)于回調(diào)函數(shù)的例子以及異步程序和非阻塞I/O的理解

JavaScript有一個(gè)明顯的特征:第一類函數(shù)(first-class functions)(wiki) 闸衫。

與第一類函數(shù)有關(guān)的名詞還有第一類對(duì)象和第一類公民(頭等公民)(wiki) ,在JavaScript中,函數(shù)是第一類對(duì)象或者說是第一類公民级乐,簡單理解,就是權(quán)限很大睹逃,可調(diào)用的資源多亚脆。這是因?yàn)檫@樣,它才可以被當(dāng)做參數(shù)或變量來使用嘹裂。

對(duì)于異步程序和非阻塞I/O妄壶,記得在知乎上看到過一個(gè)非常好的舉例:你給圖書館打電話查書,圖書館的管理員會(huì)有兩種反應(yīng)寄狼,第一種:“麻煩等一下丁寄,不用掛電話,我查一下”泊愧;第二種:“知道了伊磺,等我查到了我給您回電話”。這里面的區(qū)別删咱,一個(gè)在你屑埋,一個(gè)在電話線路。第一種情況下痰滋,你不能去干別的摘能,只能老老實(shí)實(shí)的在電話前面等著续崖,而且,別人在這段時(shí)間里沒法給你打電話了团搞。第二種情況就無所謂了严望,你可以去high,去耍逻恐,去上廁所像吻,其他的朋友給你打電話你也接的到。第一種情況就是同步的梢莽、阻塞的萧豆,第二種就是異步的奸披、非阻塞的昏名。

下面是一個(gè)nodejs的例子,創(chuàng)建一個(gè)rectangle-2.js的文件

module.exports = function(x,y,callback) {
  try {
    if (x < 0 || y < 0) {
        throw new Error("Rectangle dimensions should be greater than zero: l = "
                            + x + ", and b = " + y);
    }
    else
         callback(null, {
            perimeter: function () {
                   return (2*(x+y));
            },
            area:function () {
                    return (x*y);
            }
    });
  }
  catch (error) {
        callback(error,null);
  }
}

在創(chuàng)建一個(gè)solve-2.js的文件

var rect = require('./rectangle-2');

function solveRect(l,b) {
    console.log("Solving for rectangle with l = "
                + l + " and b = " + b);
    rect(l,b, function(err,rectangle) {
        if (err) {
        console.log(err);
    }
    else {
        console.log("The area of a rectangle of dimensions length = "
                 + l + " and breadth = " + b + " is " + rectangle.area());
            console.log("The perimeter of a rectangle of dimensions length = "
                 + l + " and breadth = " + b + " is " + rectangle.perimeter());
    }
    });
};

solveRect(2,4);
solveRect(3,5);
solveRect(-3,5);

程序是這樣運(yùn)行的阵面,用node命令

node solve-2
  1. 運(yùn)行solve-2.js轻局,rectangle-2.js文件被引用,并賦值給變量rect样刷。
  2. 在最后幾行仑扑,函數(shù)solveRect被調(diào)用三次,分別賦值(2,4)置鼻、(3,5)和(-3,5)镇饮,
  3. 在函數(shù)solveRect運(yùn)行到調(diào)用rect時(shí),也相當(dāng)于是一個(gè)賦值的過程箕母,l賦值給rectangle-2.js文件中函數(shù)的x储藐,b賦值給y,rect的第三個(gè)參數(shù)嘶是,也就是那個(gè)匿名方程钙勃,賦值給了callback。到這里solve-2.js就運(yùn)行完了聂喇,可以該干嘛干嘛了辖源。
  4. 目光放到rectangle-2.js,程序運(yùn)行希太,先在try里面判斷克饶,確定符合要求之后,就運(yùn)行callback函數(shù)誊辉,也就是第三步中賦值給callback的那個(gè)函數(shù)矾湃,求得結(jié)果。

博客:https://zhuanyongxigua.github.io

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芥映,一起剝皮案震驚了整個(gè)濱河市洲尊,隨后出現(xiàn)的幾起案子远豺,更是在濱河造成了極大的恐慌,老刑警劉巖坞嘀,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件躯护,死亡現(xiàn)場離奇詭異,居然都是意外死亡丽涩,警方通過查閱死者的電腦和手機(jī)棺滞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矢渊,“玉大人继准,你說我怎么就攤上這事“校” “怎么了移必?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長毡鉴。 經(jīng)常有香客問我崔泵,道長,這世上最難降的妖魔是什么猪瞬? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任憎瘸,我火速辦了婚禮,結(jié)果婚禮上陈瘦,老公的妹妹穿的比我還像新娘幌甘。我一直安慰自己,他們只是感情好痊项,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布锅风。 她就那樣靜靜地躺著,像睡著了一般线婚。 火紅的嫁衣襯著肌膚如雪遏弱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天塞弊,我揣著相機(jī)與錄音漱逸,去河邊找鬼。 笑死游沿,一個(gè)胖子當(dāng)著我的面吹牛饰抒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诀黍,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼袋坑,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了眯勾?” 一聲冷哼從身側(cè)響起枣宫,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤婆誓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后也颤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洋幻,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年翅娶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了文留。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡竭沫,死狀恐怖燥翅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蜕提,我是刑警寧澤森书,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站贯溅,受9級(jí)特大地震影響拄氯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜它浅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望镣煮。 院中可真熱鬧姐霍,春花似錦、人聲如沸典唇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽介衔。三九已至恨胚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炎咖,已是汗流浹背赃泡。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乘盼,地道東北人升熊。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像绸栅,于是被迫代替她去往敵國和親级野。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

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