关于node的基础理论,书上看来的
最近看了一本书,说了一些Node.js的东西,现在来记录一下,让自己记得更牢靠一点。
在书上,是这样介绍的:Node.js模型是源于Ruby的Event Machine 和 Python的Twisted模型,使用事件循环
运行JavaScript程序。不同于传统程序设计模型的阻碍调用,Node.js使用单个线程的事件循环来执行JavaScript程序
代码。并且,在书里面,也对阻碍调用进行了解释:运行程序时,必须等到上一个调用完成后,才能执行下一个函数
调用,如果调用的是处理文件I/O,因为执行时间较长,就会阻碍之后的程序代码的执行(CPU只能等待I/O结束)。但
是Node.js却不是这样,它用事件驱动程序设计来解决阻碍调用影响程序运行效率的问题。
对于有一定基础知识的人,肯定是知道什么是I/O是什么,可是任然是有人不知道什么是I/O的。那么现在就
来解释一下什么是I/O。简单的说下,所谓的I/O就是输入输出流,也就是input/output。事件在输入输出流里面,在上
一个函数没有执行完毕时,是不会进行下一件事件的。而NODE.JS的主要设计理念是I/O是影响程序效率的最大障碍,为
了提升程序运行效率,使用无阻碍I/O的事件驱动程序来建立Node.js,以事件循环方式运行Node.js程序。说到这里,
就要解释一下什么是事件循环了:事件循环是一个持续工作的循环,主要提供了2个功能,即事件侦测和触发事件处理,
在每一次执行循环就是在侦测是否有事件触发,如果有,事件循环负责判断事件绑定了哪一个回拨函数,然后调用这个
回拨函数。
有一点不得不说,Node.js使用单线程方式来执行程序代码,并没有并行执行任何Javascript程序代码,而且在
任何时刻只会有单一片段的程序代码在执行,只是因为使用无阻碍I/O的异步程序设计,程序执行就不会被缓慢的I/O操
作阻碍,所以能够大幅度的提升程序的运行效率。
Node.js的精神是将程序设计改为事件驱动的异步程序设计,而我们之所以可以如此进行程序设计,就是因为
Javascript的闭包概念。
因为Javascript函数是第一级对象(Function是Object的第一级实例),我们可以将函数当成参数来传递给其
它函数,之前的回拨函数就是使用此方式。闭包是指函数可以继承其上一层环境的变量,记住函数定义时上下文的内容,
即上衣曾函数范围内声明的变量值。
对于Node.js来说,Javascript闭包可以帮助我们创建异步程序设计的Node.js程序,因为事件驱动程序设计的
执行流程是事件决定,当事件出发时,Node.js事件循环可以调用此事件的回拨函数进行处理,回拨函数是以参数方式来
传递给其他函数的。
问题是回拨函数是在事件除法之后才会被调用和执行,当它调用时起执行范围可能早已返回释而消失。Javascript
闭包可以神奇记住调用回拨函数前的状态,简单的说,Javascript范围并不是执行时的状态,而是源代码的上下文内容,
闭包可以帮助我们记住调用前的状态(也就是具有缓存的作用,但是这个缓存却不会对全局造成影响),让程序正确的执行。
下面时最近搞错的两个方法,一个是join,另外一个是split。
join是对数组的操作,返回值是字符串,split是对字符串的操作,返回值是数组。两个方法的作用相似,但是操
做对象和返回对象正好相反。之前闹了一个大笑话.........
关于node的基础理论,书上看来的的更多相关文章
- JAVA理解逻辑程序的书上全部重要的习题
今天随便翻翻看以前学过JAVA理解逻辑程序的书上全部练习,为了一些刚学的学弟学妹,所以呢就把这些作为共享了. 希望对初学的学弟学妹有所帮助! 例子:升级“我行我素购物管理系统”,实现购物结算功能 代码 ...
- Angularjs+node+Mysql实现地图上特定点的定位以及附加信息展示
注:本博文为博主原创,转载请注明出处. 在上一篇博文中主要讲述了如何利用AngularJs+Node+MySql构建项目,并实现地图上的多点标注,今天在这篇文章中,我们将在上一个项目的基础上,实现特定 ...
- c++编程思想(四)--对象和隐藏(感觉书上有误)
c++编程思想里数据抽象和隐藏实现实际就是通常所说的类和封装: 封装,继承,多态对象特点说的很多,就不再说了 关于封装,本人觉得书上有个地方写的有问题,p145和p153都提到Y::f(X*)引用了X ...
- Node.js~在linux上的部署~pm2管理工具的使用
之前写了两篇关于在linux上部署nodejs的文章,大家如果没有基础可以先看前两篇<Node.js~在linux上的部署>,<Node.js~在linux上的部署~外网不能访问no ...
- OK 开始实践书上的项目一:即使标记
OK 开始实践书上的项目一:及时标记 然而....又得往前面看啦! ----------------------我是分割线------------------------ 代码改变世界
- 使用express+multer实现node中的图片上传
使用express+multer实现node中的图片上传 在前端中,我们使用ajax来异步上传图片,使用file-input来上传图片,使用formdata对象来处理图片数据,post到服务器中 在n ...
- node中间层实现文件上传
一般情况下,前端的文件上传一般都是通过form表单的(<input type="file" />)来完成文件的上传,如果使用node中间层完成跨域,文件的上传就需要在n ...
- OpenACC 书上的范例代码(Jacobi 迭代),part 3
▶ 使用Jacobi 迭代求泊松方程的数值解 ● 使用 data 构件,强行要求 u0 仅拷入和拷出 GPU 各一次,u1 仅拷入GPU 一次 #include <stdio.h> #in ...
- java代码流类。。程序怎么跟书上的结果不一样???
总结:这个程序很容易懂.的那是这个结果我觉得有问题啊..怎么“stop”后,输出的内容是输入过的呢? 应该是没有关系的呀,与输入的值是不同的....怎么书上运行的结果和我的不一样啊 package c ...
随机推荐
- Spring的IOC分析(一)
我们学习Spring之前需要对23种java的设计模式的9种有一定的理解,设计模式为了解耦,Spring也是在解耦的方向上设计的,所以设计模式要理解一下,它当中用到了很多. 单例模式(写法很多钟,7种 ...
- Linux 离线安装Rubygems详解
很多时候我们会发现,真实的生成环境很多都没有外网,只有内网环境,这个时候我们又需要安装RubyGems,则不能提供yum命令进行在线安装了,这个时候我们就需要下载安装包进行离线安装.本文主要简单介绍如 ...
- 番外篇--Moddule Zero 版本管理与组织单位管理
Moddule Zero 版本管理 2.2.1 简介 大多数SaaS(多租户)应用都会有多个版本(包),这些版本的功能点也会各不相同.因此,他们能够为他们的租户(客户)提供不同的价格和功能点选项. 关 ...
- mybatis sql循环的使用
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index,collection,open,separator,close. ...
- GitHub上传文件或项目的教程
既然是往GitHub上传文件,那GitHub账号必须得有,这时候就会有同学问:妖怪吧,我没有GitHub账号怎么办? 别急别急,打开GitHub网站https://github.com/,然后注册就O ...
- 性能测试资源监控工具nmon使用方法
1.简述 nmon是一种在AIX与各种Linux操作系统上广泛使用的监控与分析工具,相对于其它一些系统资源监控工具来说,nmon所记录的信息是比较全面的,它能在系统运行过程中实时地捕捉系统资源的使用 ...
- Dig out WeChat deleted chat messages on Android Phone
As we know that WeChat will wipe deleted chat messages. That's why forensic guys could not dig out ...
- Cocoa的MVC架构分析
Cocoa是Mac OS和iPhone OS上的开发框架,使用Objective-C做为开发语言.当然,在代码中也可以嵌入C和C++的语句.初识Objective-C时会觉得它的语法很奇怪,但本质上和 ...
- [知了堂学习笔记]_Java代码实现MySQL数据库的备份与还原
通常在MySQL数据库的备份和恢复的时候,多是采用在cmd中执行mysql命令来实现. 例如: mysqldump -h127.0.0.1 -uroot -ppass test > d:/tes ...
- Java进阶篇(五)——Java的I/O技术
程序中,为了永久的保存创建的数据,需要将其保存在磁盘文件中,以便在其它程序中使用它们.Java的I/O技术可以将数据保存到文本文件.二进制文件甚至是ZIP压缩文件中,以达到永久性保存数据的要求. 本篇 ...