最近看了一本书,说了一些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的基础理论,书上看来的的更多相关文章

  1. JAVA理解逻辑程序的书上全部重要的习题

    今天随便翻翻看以前学过JAVA理解逻辑程序的书上全部练习,为了一些刚学的学弟学妹,所以呢就把这些作为共享了. 希望对初学的学弟学妹有所帮助! 例子:升级“我行我素购物管理系统”,实现购物结算功能 代码 ...

  2. Angularjs+node+Mysql实现地图上特定点的定位以及附加信息展示

    注:本博文为博主原创,转载请注明出处. 在上一篇博文中主要讲述了如何利用AngularJs+Node+MySql构建项目,并实现地图上的多点标注,今天在这篇文章中,我们将在上一个项目的基础上,实现特定 ...

  3. c++编程思想(四)--对象和隐藏(感觉书上有误)

    c++编程思想里数据抽象和隐藏实现实际就是通常所说的类和封装: 封装,继承,多态对象特点说的很多,就不再说了 关于封装,本人觉得书上有个地方写的有问题,p145和p153都提到Y::f(X*)引用了X ...

  4. Node.js~在linux上的部署~pm2管理工具的使用

    之前写了两篇关于在linux上部署nodejs的文章,大家如果没有基础可以先看前两篇<Node.js~在linux上的部署>,<Node.js~在linux上的部署~外网不能访问no ...

  5. OK 开始实践书上的项目一:即使标记

    OK 开始实践书上的项目一:及时标记 然而....又得往前面看啦! ----------------------我是分割线------------------------ 代码改变世界

  6. 使用express+multer实现node中的图片上传

    使用express+multer实现node中的图片上传 在前端中,我们使用ajax来异步上传图片,使用file-input来上传图片,使用formdata对象来处理图片数据,post到服务器中 在n ...

  7. node中间层实现文件上传

    一般情况下,前端的文件上传一般都是通过form表单的(<input type="file" />)来完成文件的上传,如果使用node中间层完成跨域,文件的上传就需要在n ...

  8. OpenACC 书上的范例代码(Jacobi 迭代),part 3

    ▶ 使用Jacobi 迭代求泊松方程的数值解 ● 使用 data 构件,强行要求 u0 仅拷入和拷出 GPU 各一次,u1 仅拷入GPU 一次 #include <stdio.h> #in ...

  9. java代码流类。。程序怎么跟书上的结果不一样???

    总结:这个程序很容易懂.的那是这个结果我觉得有问题啊..怎么“stop”后,输出的内容是输入过的呢? 应该是没有关系的呀,与输入的值是不同的....怎么书上运行的结果和我的不一样啊 package c ...

随机推荐

  1. UEP-弹窗

    注意:弹出窗口Action中的dataWrap属性要加上set方法 默认情况下为GET方式传递参数,此方法对参数的长度有限制,若是长度超过范围的话请使用POST方式 function testPopW ...

  2. docker创建ceph集群

    背景 Ceph官方现在提供两类镜像来创建集群,一种是常规的,每一种Ceph组件是单独的一个镜像,如ceph/daemon.ceph/radosgw.ceph/mon.ceph/osd等:另外一种是最新 ...

  3. [国嵌笔记][021-022][ARM处理器工作模式]

    [ARM处理器工作模式] 处理器工作模式 1.User(urs):用户模式,linux应用程序运行在用户模式 2.FIQ(fiq):快速中断模式 3.IRQ(irq):中断模式 4.Superviso ...

  4. 函数iconv_substr和mb_substr

    二个函数iconv_substr和mb_substr,均可以在当前字符下进行字符串截取,以达到中文字符截取的不乱码. 应该如何选择呢? 1.iconv库在某些操作系统上可能运行不正确,需要安装GNU扩 ...

  5. 使用vue框架运行npm run dev 时报错解决

    使用使用vue框架运行npm run dev 时报错 如下: 原因: localhost:8080 有可能其他软件占用了,导致其他问题的出现 我们可以动态修改地址 解决: 进入项目文件的config文 ...

  6. 003_JS基础_面向对象基础

    3.1 对象   引入:在js中表示一个人的信息(name, gender, age)通过var申明三个变量,但是这样使用基本数据类型的变量,他们是互相独立的,没有联系:  此时就需要使用对象,对象是 ...

  7. vi命令加行号查找替换等命令

    一.加行号           : set nu二.vi查找:    当你用vi打开一个文件后,因为文件太长,如何才能找到你所要查找的关键字呢?在vi里可没有菜单-〉查找,              ...

  8. vue学习笔记(二)——简单的介绍以及安装

    学习编程需要的是 API+不断地练习^_^ Vue官网:https://cn.vuejs.org/ 菜鸟教程:http://www.runoob.com/vue2/vue-tutorial.html ...

  9. WEB前端大神之路之基础篇

    CSS篇: 1.CSS权重: 不重复造轮子啦,直接传送门(CSS选择器的权重与优先规则) JavaScript篇: 1.this关键字: 它是一种引用(referent).指向的是当前上下文(cont ...

  10. mybatis-pageHelper做分页

    Mybatis-PageHelpera是一个很好的第三方分页插件,支持很多数据库,几乎主流的数据库都支持 github地址:https://github.com/pagehelper/Mybatis- ...