基礎知識點

  1. 事件循環(huán)(event loop)
    js是單線程語言,這是由于設計者最初設計的時候,考慮到其只運行在瀏覽器端,不應該太復雜霸褒。
    事件循環(huán)有兩個重要部分:1.事件 2.事件的訂閱者,也就是事件處理器妙蔗。
    一個Nodejs程序運行后,事件循環(huán)就會一直存在疆瑰,拋出事件眉反,直到程序結束運行。事件循環(huán)需借助操作系統(tǒng)進行實現(xiàn)穆役,如select寸五、epoll、kqueue耿币、IOCP梳杏;Nodejs是對系統(tǒng)進行了進一步的封裝(libuv)。

    Paste_Image.png

    什么是 Event Loop淹接?
    [譯]事件循環(huán)十性,Node.js背后的核心概念

  2. setImmediate VS process.nextTick VS setTimeout(fn, 0)

  • process.nextTick: 回調函數(shù)會被放入數(shù)組中,而且在下一次事件循環(huán)前一起執(zhí)行塑悼;
  • setImmediate: 回調函數(shù)放入鏈表中劲适,下次循環(huán)結束后從鏈表中取出一個執(zhí)行。
  • setTimeout(fn, 0): 通過源碼可知厢蒜,它是按照setTimeout(fn, 1)執(zhí)行的霞势,因此如果一個時間循環(huán)的時間小于1ms烹植,那么setImmediate在前,否則setTimeout(fn, 0)在前愕贡。 但是考慮到setTimeout(fn, 0)的性能問題草雕,Node作者推薦采用setImmediate。

三者中process.nextTick的優(yōu)先級最高固以,其次是setTimeout墩虹,但是這并不一定代表執(zhí)行順序。由于setTimeout采用紅黑樹實現(xiàn)嘴纺,setImmediate采用鏈表實現(xiàn)败晴;對比效率而言,Node中推薦采用setImmediate栽渴。

setImmediate vs nextTick vs setTimeout(fn, 0)

  1. 全局對象
    Node的全局對象是global尖坤,瀏覽器中的全局變量是window,可以根據(jù)這個區(qū)分js是運行在瀏覽器中還是Node中闲擦。
    在瀏覽器中慢味,var定義的變量會掛載到window下,因此: var x=1; window.x==1 //true墅冷;
    在Node中纯路,var定義的變量并不會掛載到global下,因此:var x=1; global.x==1 //false寞忿。
    Node還提供了 process驰唬、 consolesetTimeout等全局的對象或者方法腔彰。

  2. exportsmodule.exports的區(qū)別
    Nodje的輸出是module.exports叫编。 module.exports默認是一個空對象 {}exports是指向其的引用霹抛。舉個例子:

  var aa = {};
var bb = aa;  // bb就是aa的引用
bb.cc = 1;
aa.cc == 1 // true
aa = {dd:1}
bb.dd == 1 // false  undefined

類似上述的例子去理解兩者的區(qū)別:
```
// b.js 輸出一個函數(shù)搓逾,改變了module.exports的默認值{},此時exports和module.exports不再指向同一個對象
module.exports = function (name, age) {
// exports = module.exports = function (name, age) { // 此時兩者還是指向同一個對象
this.name = name;
this.age = age;
}
exports.sex = "male";

  var Person = require("./b");
  var person = new Person("Tony", 33);
  console.log(person); // {name:"Tony", age:33}
  console.log(Person.sex); // undefined
```
  1. 模塊機制
    模塊優(yōu)先從緩存中加載杯拐,模塊分析按照.js霞篡、.json.node擴展名進行端逼。
    三種類型的模塊:
  2. 核心模塊朗兵,如http,fs
  3. .顶滩、..矛市、/等相對或絕對路徑的文件模塊。
  4. 非路徑形式的文件模塊诲祸,如從npm下載到本地的模塊浊吏。

第3種模塊而昨,系統(tǒng)會迭代遍歷當前目錄或者父目錄的node-modules文件夾進行查找。如果找到的不是一個文件找田,而是一個文件夾歌憨,那么系統(tǒng)會解析文件夾的package.json文件進行分析。

  1. uncaughtException
    異常處理可以通過try...catch進行捕獲墩衙;但是如果try中的異常是異步的务嫡,并不會被catch到:
try{
  process.nextTick(function my_app(){
      throw new Error('Catch me');
  })
}catch(e){
  // never called
}

異常沒有被捕獲到,就會通過事件冒泡最終觸發(fā)uncaughtException事件漆改。有uncaughtException時心铃,服務會觸發(fā)exist事件,造成進程退出挫剑。如果想監(jiān)聽uncaughtException處理服務的全局異常去扣,可能會造成服務超時;進一步造成內存泄露和服務的不穩(wěn)定樊破。
比較好的處理方式是:借助cluster模式愉棱,針對異常返回一個錯誤碼,然后重啟該wordker實例哲戚。
NodeJS 異常處理 uncaughtException 篇
Node.js 異步異常的處理與domain模塊解析

參考文章:
  1. Node.js面試題:側重后端應用與對Node核心的理解
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末奔滑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子顺少,更是在濱河造成了極大的恐慌朋其,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脆炎,死亡現(xiàn)場離奇詭異梅猿,居然都是意外死亡,警方通過查閱死者的電腦和手機腕窥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門粒没,熙熙樓的掌柜王于貴愁眉苦臉地迎上來筛婉,“玉大人簇爆,你說我怎么就攤上這事∷觯” “怎么了入蛆?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長硕勿。 經常有香客問我哨毁,道長,這世上最難降的妖魔是什么源武? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任扼褪,我火速辦了婚禮想幻,結果婚禮上,老公的妹妹穿的比我還像新娘话浇。我一直安慰自己脏毯,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布幔崖。 她就那樣靜靜地躺著食店,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赏寇。 梳的紋絲不亂的頭發(fā)上吉嫩,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音嗅定,去河邊找鬼自娩。 笑死,一個胖子當著我的面吹牛露戒,可吹牛的內容都是我干的椒功。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼智什,長吁一口氣:“原來是場噩夢啊……” “哼动漾!你這毒婦竟也來了?” 一聲冷哼從身側響起荠锭,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤旱眯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后证九,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體删豺,經...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年愧怜,在試婚紗的時候發(fā)現(xiàn)自己被綠了呀页。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡拥坛,死狀恐怖蓬蝶,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情猜惋,我是刑警寧澤丸氛,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站著摔,受9級特大地震影響缓窜,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一禾锤、第九天 我趴在偏房一處隱蔽的房頂上張望私股。 院中可真熱鬧,春花似錦恩掷、人聲如沸庇茫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旦签。三九已至,卻和暖如春寸宏,著一層夾襖步出監(jiān)牢的瞬間宁炫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工氮凝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留羔巢,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓罩阵,卻偏偏與公主長得像竿秆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子稿壁,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內容

  • topics: 1.The Node.js philosophy 2.The reactor pattern 3....
    宮若石閱讀 1,092評論 0 1
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,819評論 1 10
  • js歷史 是基于事件和對象驅動的解釋性幽钢,松散型的語言解釋性:由瀏覽器解釋執(zhí)行松散型:變量可以用來保存任何類型的數(shù)據(jù)...
    程少輝閱讀 501評論 0 0
  • Node.js是目前非常火熱的技術傅是,但是它的誕生經歷卻很奇特匪燕。 眾所周知,在Netscape設計出JavaScri...
    w_zhuan閱讀 3,617評論 2 41
  • 夢喧笔,是一個美妙的字眼帽驯,因為夢,我們可以來到現(xiàn)實世界以外的地方书闸,可以在靜謐的夜晚尼变,任憑思維的天馬行空...
    coco宣閱讀 334評論 0 2