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


Posted in Javascript onSeptember 16, 2018

Node.js是建立在Chrome强劲的V8 JavaScript引擎上的服务器端框架。虽然最初是用C++编写的,但是应用程序通过JavaScript运行。

下面这4个基本概念是你想要掌握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

以上4条JavaScript概念是Node.js新手必须知的个最重要概念,越是基础的东西越是重要,大家一家要牢记

Javascript 相关文章推荐
基于jQuery的360图片展示实现代码
Jun 14 Javascript
javascript的offset、client、scroll使用方法详解
Dec 25 Javascript
jquery获取radio值(单选组radio)
Oct 16 Javascript
超级简单的jquery操作表格方法
Dec 15 Javascript
AngularJS 入门教程之事件处理器详解
Aug 19 Javascript
js 动态生成html 触发事件传参字符转义的实例
Feb 14 Javascript
Angular.js组件之input mask对input输入进行格式化详解
Jul 10 Javascript
JS设计模式之单例模式(一)
Sep 29 Javascript
vue嵌套路由与404重定向实现方法分析
May 04 Javascript
修改layui的后台模板的左侧导航栏可以伸缩的方法
Sep 10 Javascript
手写Vue2.0 数据劫持的示例
Mar 04 Vue.js
游戏开发中如何使用CocosCreator进行音效处理
Apr 14 Javascript
分享5个顶级的JavaScript Ajax组件库
Sep 16 #Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
Sep 16 #Javascript
vue主动刷新页面及列表数据删除后的刷新实例
Sep 16 #Javascript
vue将毫秒数转化为正常日期格式的实例
Sep 16 #Javascript
Vue filter格式化时间戳时间成标准日期格式的方法
Sep 16 #Javascript
vue 2.1.3 实时显示当前时间,每秒更新的方法
Sep 16 #Javascript
vue debug 二种方法
Sep 16 #Javascript
You might like
冰滴咖啡制作步骤
2021/03/03 冲泡冲煮
从php核心代码分析require和include的区别
2011/01/02 PHP
php读取二进制流(C语言结构体struct数据文件)的深入解析
2013/06/13 PHP
解析PHP中的内存管理,PHP动态分配和释放内存
2013/06/28 PHP
百度工程师讲PHP函数的实现原理及性能分析(一)
2015/05/13 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
PHP PDOStatement::columnCount讲解
2019/01/30 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
2019/04/09 PHP
PHP命名空间(namespace)原理与用法详解
2019/12/11 PHP
js右键菜单效果代码
2007/07/21 Javascript
JavaScript 脚本将当地时间转换成其它时区
2009/03/19 Javascript
jquery 弹出层注册页面等(asp.net后台)
2010/06/17 Javascript
EasyUI框架 使用Ajax提交注册信息的实现代码
2017/09/27 Javascript
AngularJS遍历获取数组元素的方法示例
2017/11/11 Javascript
vue.js 实现点击按钮动态添加li的方法
2018/09/07 Javascript
JavaScript实现图片上传并预览并提交ajax
2019/09/30 Javascript
Vuex实现数据共享的方法
2019/12/20 Javascript
vue实现微信浏览器左上角返回按钮拦截功能
2020/01/18 Javascript
微信小程序 button样式设置为图片的方法
2020/06/19 Javascript
超详细小程序定位地图模块全系列开发教学
2020/11/24 Javascript
Python使用Scrapy保存控制台信息到文本解析
2017/12/27 Python
通过python顺序修改文件名字的方法
2018/07/11 Python
python一键去抖音视频水印工具
2018/09/14 Python
Python操作json的方法实例分析
2018/12/06 Python
Python脚本修改阿里云的访问控制列表的方法
2019/03/08 Python
Django中ORM外键和表的关系详解
2019/05/20 Python
Python GUI学习之登录系统界面篇
2019/08/21 Python
python制作英语翻译小工具代码实例
2019/09/09 Python
CSS3关于z-index不生效问题的解决
2020/02/19 HTML / CSS
Airbnb爱彼迎官网:成为爱彼迎房东,赚取收入
2019/03/14 全球购物
个人找工作求职简历的自我评价
2013/10/20 职场文书
护理学院专科毕业生求职信
2014/06/28 职场文书
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
2021/06/21 Oracle
浅谈Python数学建模之数据导入
2021/06/23 Python
教你一步步实现一个简易promise
2021/11/02 Javascript
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android