基础知识点

  1. 事件循环(event loop)
    js是单线程语言,这是由于设计者最初设计的时候,考虑到其只运行在浏览器端,不应该太复杂。
    事件循环有两个重要部分:1.事件 2.事件的订阅者,也就是事件处理器。
    一个Nodejs程序运行后,事件循环就会一直存在,抛出事件,直到程序结束运行。事件循环需借助操作系统进行实现,如select、epoll、kqueue、IOCP;Nodejs是对系统进行了进一步的封装(libuv)。

    Paste_Image.png

    什么是 Event Loop?
    [译]事件循环,Node.js背后的核心概念

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

  • process.nextTick: 回调函数会被放入数组中,而且在下一次事件循环前一起执行;
  • setImmediate: 回调函数放入链表中,下次循环结束后从链表中取出一个执行。
  • setTimeout(fn, 0): 通过源码可知,它是按照setTimeout(fn, 1)执行的,因此如果一个时间循环的时间小于1ms,那么setImmediate在前,否则setTimeout(fn, 0)在前。 但是考虑到setTimeout(fn, 0)的性能问题,Node作者推荐采用setImmediate。

三者中process.nextTick的优先级最高,其次是setTimeout,但是这并不一定代表执行顺序。由于setTimeout采用红黑树实现,setImmediate采用链表实现;对比效率而言,Node中推荐采用setImmediate。

setImmediate vs nextTick vs setTimeout(fn, 0)

  1. 全局对象
    Node的全局对象是global,浏览器中的全局变量是window,可以根据这个区分js是运行在浏览器中还是Node中。
    在浏览器中,var定义的变量会挂载到window下,因此: var x=1; window.x==1 //true
    在Node中,var定义的变量并不会挂载到global下,因此:var x=1; global.x==1 //false
    Node还提供了 processconsolesetTimeout等全局的对象或者方法。

  2. exportsmodule.exports的区别
    Nodje的输出是module.exportsmodule.exports默认是一个空对象 {}exports是指向其的引用。举个例子:

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

类似上述的例子去理解两者的区别:
```
// b.js 输出一个函数,改变了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. 模块机制
    模块优先从缓存中加载,模块分析按照.js.json.node扩展名进行。
    三种类型的模块:
  2. 核心模块,如http,fs
  3. .../等相对或绝对路径的文件模块。
  4. 非路径形式的文件模块,如从npm下载到本地的模块。

第3种模块,系统会迭代遍历当前目录或者父目录的node-modules文件夹进行查找。如果找到的不是一个文件,而是一个文件夹,那么系统会解析文件夹的package.json文件进行分析。

  1. uncaughtException
    异常处理可以通过try...catch进行捕获;但是如果try中的异常是异步的,并不会被catch到:
try{
  process.nextTick(function my_app(){
      throw new Error('Catch me');
  })
}catch(e){
  // never called
}

异常没有被捕获到,就会通过事件冒泡最终触发uncaughtException事件。有uncaughtException时,服务会触发exist事件,造成进程退出。如果想监听uncaughtException处理服务的全局异常,可能会造成服务超时;进一步造成内存泄露和服务的不稳定。
比较好的处理方式是:借助cluster模式,针对异常返回一个错误码,然后重启该wordker实例。
NodeJS 异常处理 uncaughtException 篇
Node.js 异步异常的处理与domain模块解析

参考文章:
  1. Node.js面试题:侧重后端应用与对Node核心的理解
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容

  • topics: 1.The Node.js philosophy 2.The reactor pattern 3....
    宫若石阅读 1,064评论 0 1
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,788评论 1 10
  • js历史 是基于事件和对象驱动的解释性,松散型的语言解释性:由浏览器解释执行松散型:变量可以用来保存任何类型的数据...
    程少辉阅读 492评论 0 0
  • Node.js是目前非常火热的技术,但是它的诞生经历却很奇特。 众所周知,在Netscape设计出JavaScri...
    w_zhuan阅读 3,612评论 2 41
  • 梦,是一个美妙的字眼,因为梦,我们可以来到现实世界以外的地方,可以在静谧的夜晚,任凭思维的天马行空...
    coco宣阅读 329评论 0 2