我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Node.js的4个基本概念详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Node.js的4个基本概念详解

本篇内容主要讲解“Node.js的4个基本概念详解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js的4个基本概念详解”吧!

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个基本概念详解”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Node.js的4个基本概念详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

基于线程、并发的基本概念(详解)

什么是线程?提到“线程”总免不了要和“进程”做比较,而我认为在Java并发编程中混淆的不是“线程”和“进程”的区别,而是“任务(Task)”。进程是表示资源分配的基本单位。而线程则是进程中执行运算的最小单位,即执行处理机调度的基本单位。关于
2023-05-31

VB.NET多维数组基本概念详解

VB.NET中的多维数组是一种特殊的数据结构,它可以存储多个值,并且可以按照多个维度进行索引和访问。多维数组的基本概念包括以下几点:1. 维度:多维数组可以有多个维度,每个维度表示数组中的一个方向。例如,一个二维数组可以有两个维度,分别表示
2023-09-22

Java 虚拟机(JVM)之基本概念详解

1、类加载子系统:负责从文件系统或者网络中加载Class信息,加载的信息存放在一块称之为方法区的内存空间。2、方法区:就是存放类信息、常量信息、常量池信息、包括字符串字面量和数字常量等。方法区是辅助堆栈的块永久区,解决堆栈信息的产生,是先决
2023-05-31

VB.NET变量生存周期的基本概念详解

这篇文章主要讲解了“VB.NET变量生存周期的基本概念详解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“VB.NET变量生存周期的基本概念详解”吧!VB.NET变量生存周期 这一点程序员们都
2023-06-17

了解 PHP Session 跨域的基本概念

在开发 web 应用程序时,我们经常会遇到处理用户会话(session)的需求。PHP 提供了 Session 功能来跟踪用户在不同页面间的状态。然而,当 web 应用程序涉及到跨域访问时,Session 的管理会变得稍微复杂一些。本文将介
2023-10-21

基于java中集合的概念(详解)

1.集合是储存对象的,长度可变,可以封装不同的对象2.迭代器: 其实就是取出元素的方式(只能判断,取出,移除,无法增加)就是把取出方式定义在集合内部,这样取出方式就可以直接访问集合内部的元素,那么取出方式就被定义成了内部类.二每一个容器的数
2023-05-31

PHP数组基本概念详细介绍是怎样的

PHP数组基本概念详细介绍是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。数组在我们PHP中是很重要的,如何利用数组实现我们想要的功能,我们这里就来看看关
2023-06-17

编程热搜

目录