文档章节

Node.js新手必须知道的4个JavaScript概念

小致dad
 小致dad
发布于 2016/07/16 13:08
字数 2043
阅读 13
收藏 0

如果只需要知道一种编程语言就可以构建一个全栈的应用程序,是不是特别了不起?Ryan Dahl为了把这个想法成为现实,创造了node.js。Node.js是建立在Chrome强劲的V8 JavaScript引擎上的服务器端框架。虽然最初是用C++编写的,但是应用程序通过JavaScript运行。

这样一来,问题就解决了。一种语言就可以统治一切。而且,在整个应用程序中你只需要使用这一种语言。所以,我们需要深刻了解node.js。这就是本文的主题。

下面这四个基本概念是你想要掌握node.js所必需的。我会尽可能长话短说向大家介绍它们。

1.非阻塞或异步I/O

由于Node.js是一种服务器端框架,所以它的一个主要工作就是处理浏览器请求。在传统的I/O系统中,当前请求只有当先前请求的响应(HTML页面)已到达才会发出。这就是为什么它被称为阻塞I/O。服务器阻塞其他请求是为了处理当前的请求,而这会导致浏览器的等待。

Node.js不遵循I/O的这个原则。如果一个请求需要花费较长时间,那么Node.js会发送请求到事件循环(event loop)中,并继续在调用栈(call stack)中处理下一个请求。一旦未决请求完成处理,它就会告诉Node.js,并将响应渲染在浏览器上。

用一个虚拟的例子来理解这一点:

阻塞I / O

// take order for table 1 and wait...
var order1 = orderBlocking(['Coke', 'Iced Tea']);
// once order is ready, take order back to table.
serveOrder(order1);
// once order is delivered, move on to another table.
// take order for table 2 and wait...
var order2 = orderBlocking(['Coke', 'Water']);
// once order is ready, take order back to table.
serveOrder(order2);
// once order is delivered, move on to another table.
// take order for table 3 and wait...
var order3 = orderBlocking(['Iced Tea', 'Water']);
// once order is ready, take order back to table.
serveOrder(order3);
// once order is delivered, move on to another table.

在这个餐厅例子中,服务员给出菜单,等待订单完成,然后再回到餐桌根据菜单上菜。在当前客户点菜时,服务员就在旁边等待,不接受其他客户的菜单。

非阻塞I / O

// take order for table 1 and move on...
orderNonBlocking(['Coke', 'Iced Tea'], function(drinks){
  return serveOrder(drinks);
});
// take order for table 2 and move on...
orderNonBlocking(['Beer', 'Whiskey'], function(drinks){
  return serveOrder(drinks);
});
// take order for table 3 and move on...
orderNonBlocking(['Hamburger', 'Pizza'], function(food){
  return serveOrder(food);
});

在这个例子中,服务员获得菜单,并告知厨师,然后返回取另一份菜单。在完成第一个菜单进程中,他既按照顺序给当前顾客上菜,也接受来自其他客户的点单。服务员不会因为阻塞来自于其他客户的点菜而浪费时间。

2.原型

原型是JavaScript的一个复杂概念。不过因为在Node.js中你要多次用到原型,所以每个JavaScript开发人员都必须了解这个概念。

在实现经典继承的语言中,例如Java,或C ++,对于以代码重用为目的的语言,你首先必须写一个类,然后从该类创建对象或扩展该类。但是,在JavaScript中不存在类的概念。首先在JavaScript中创建一个对象,然后从这个对象中增加自己的对象,或创建新的对象。这就是所谓的原型传承和通过原型的实现。

每个JavaScript对象被链接到一个来自于它可以继承属性的原型对象。原型类似其他OO语言中的类,但不同的是,它们本身也是对象。每一个对象都链接到Object.prototype,而Object.prototype自带JavaScript预定义。

如果你通过obj.propName或 obj['propName'] 查找属性,而对象并不具有可通过 obj.hasOwnProperty(‘propName’)被检查的属性,那么JavaScript的运行时会在其原型对象中查找属性。如果原型对象也没有这样的属性,那么依次检查它的原型,直到找到匹配,或者到达Object.prototype。如果该属性不存在原型链,那么它会导致一个未定义的值。

通过下面的示例代码来理解这个概念:

if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        var F = function () {};
        F.prototype = o;
        return new F();
    };
var otherPerson = Object.create(person);

当你创建一个新对象的时候,你必须选择一个应该是它的原型的对象。这里,我们添加了一个方法到Object  function。该方法创建了一个使用另一个对象作为其原型的新对象,而原型作为参数传递给它。

当我们改变新对象的时候,它的原型不受影响。但是,当我们进行改变原型对象的时候,这些变化在所有基于该原型的对象上可见。

原型是一个复杂的概念。我将在另一篇文章中详细说明。

3.模块

如果你曾经接触过Java中的包,那么Node.js中的模块也没有什么不同。如果没有,那么也不用担心。模块是包含特定目的代码的简单的JavaScript文件。模块模式用来使你的代码易于导航和使用。要使用模块属性,你需要在JavaScript文件中需求它,很像在Java类中导入包。

node.js中有两种类型的模块。

核心模块——这些模块是用Node.js库预编译过的。核心模块的目的是提供开发者经常发生和重复的代码段,这些代码段如果不可用的话,会导致开发者陷入不得不一次又一次地写相同代码的处境。一些常见的核心模块是HTTP,URL,EVENTS,FILE SYSTEM,等等。

用户定义模块——用户定义模块是开发人员在应用程序内创建用于特定目的的模块。当核心模块不能满足期望功能的时候就需要用户定义模块。

模块通过require函数提取。如果它是一个核心模块,那么参数仅仅是模块的名称。如果它是一个用户自定义模块,那么参数就是该模块在文件系统中的路径。例如:

// extract a core module like this
var http = require('http);
// extract a user defined module like this
var something = require('./folder1/folder2/folder3/something.js');

4.回调函数

在JavaScript中,函数被认为是第一类对象。这意味着你可以对这些函数做所有可对常规对象做的操作。你可以赋值函数给变量,作为参数传递函数给方法,作为对象属性声明函数,甚至从函数返回函数。

回调函数是JavaScript中的匿名函数,它可以作为参数传递给其他函数,要么被执行或返回自函数稍后执行。这是回调函数——这个使用最广的函数编程范式的基础。

当我们将回调函数作为参数传递给另一个函数的时候,我们只能传递函数定义……换言之就是,我们不知道这个回调函数什么时候会执行。这完全取决于调用函数的机制。它会在以后的某个时间点“回调”,因此而得名。这也是非阻塞或Node.js异步行为的唯一基础,如下例所示。

setTimeout(function() {
    console.log("world");
}, 2000)
console.log("hello");

这是回调函数最简单的例子之一。我们将一个匿名函数作为一个参数传递,这个参数只需在控制台上记录一些输出到setTimeout函数。它是唯一的函数定义,但是不知道何时执行。这需要经过2秒后,通过第二个参数,调用setTimeout函数来决定。

首先,第二个日志语句记录输出到控制台,然后,2秒钟后,回调函数中的日志语句记录输出。

// output
hello
world

上面这些就是Node.js新手必须知道的4个最重要的 JavaScript概念。你的看法呢?希望大家能够畅所欲言!

© 著作权归作者所有

共有 人打赏支持
小致dad
粉丝 145
博文 538
码字总数 580295
作品 0
济南
技术主管
私信 提问
Node.js开发者必须了解的4个JS要点

Node.js是一个面向服务器的框架,立足于Chrome强大的V8 JS引擎。尽管它由C++编写而成,但是它及其应用是运行在JS上的。本文为开发者总结了4个Node.js要点。 1. 非阻塞(Non-blocking)或异步I...

前端全栈开发学习
11/13
0
0
关于 Node.js: 所有PHP开发人员应该知道的5点

我最近开始和Node.js打交道。以前做PHP开发,特别是Drupal,我发现向Node.js转移很容易,而且过程很愉快!但是我也需要学会从一些不同的角度思考。下面我列出了5项我认为PHP工程师应该知道的...

虫虫
2012/02/07
17.2K
26
Node.js VS PHP:Web 开发的史诗级对决,你支持谁?

现在,Web开发公司和开发人员可以选择多种技术栈来构建Web应用程序。早期网络发展,不同的技术被用于前端和后端开发。但是,随着Node.js的发布,布局发生了变化,因为它允许开发人员使用 Ja...

uzv80px5v412ne
2017/12/29
0
0
Node.js VS PHP — 你应该选择哪一个?

现在,Web开发公司和开发人员可以选择多种技术栈来构建Web应用程序。早期网络发展,不同的技术被用于前端和后端开发。但是,随着Node.js的发布,布局发生了变化,因为它允许开发人员使用 Ja...

周其
2017/12/23
10.6K
85
五个最热门的开源机器学习 JavaScript 框架

如果你是一位想要深入机器学习的 JavaScript 程序员或想成为一位使用 JavaScript 的机器学习专家,那么这些开源框架也许会吸引你。 开源工具的涌现使得开发者能够更加轻松地开发应用,这一点...

16%
07/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗? Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“...

Jack088
昨天
10
0
大数据教程(10.1)倒排索引建立

前面博主介绍了sql中join功能的大数据实现,本节将继续为小伙伴们分享倒排索引的建立。 一、需求 在很多项目中,我们需要对我们的文档建立索引(如:论坛帖子);我们需要记录某个词在各个文...

em_aaron
昨天
13
0
"errcode": 41001, "errmsg": "access_token missing hint: [w.ILza05728877!]"

Postman获取微信小程序码的时候报错, errcode: 41001, errmsg: access_token missing hint 查看小程序开发api指南,原来access_token是直接当作parameter的(写在url之后),scene参数一定要...

两广总督bogang
昨天
18
0
MYSQL索引

索引的作用 索引类似书籍目录,查找数据,先查找目录,定位页码 性能影响 索引能大大减少查询数据时需要扫描的数据量,提高查询速度, 避免排序和使用临时表 将随机I/O变顺序I/O 降低写速度,占用磁...

关元
昨天
11
0
撬动世界的支点——《引爆点》读书笔记2900字优秀范文

撬动世界的支点——《引爆点》读书笔记2900字优秀范文: 作者:挽弓如月。因为加入火种协会的读书活动,最近我连续阅读了两本论述流行的大作,格拉德威尔的《引爆点》和乔纳伯杰的《疯传》。...

原创小博客
昨天
30
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部