解惑node中的单线程

这里说一下node.js中的单线程缘由还是基于前段时间公司内部培训同事提出的问题:在网络通讯编程中,按照以往的语言或平台,应对成百上千的socket连接时,往往都会利用多线程的特性,对每个连接开启子线程分别接收数据再处理。那么在node.js中它是单线程,是基于事件响应的,即将每个的连接、处理事件会放到一个事件队列里面依次处理。那么问题来了,同事说如果某一个连接上来以后,一直在给服务器发送数据,那么排在事件队列后面的连接怎么处理,会一直等待吗?这个当然不是,下面我先用一个例子来说明一下这个问题的答案,方便理解。

我们准备模拟这样一个场景:一个客户端向服务器发起tcp连接,成功之后,客户端一直给服务器发送数据,而服务器收到数据后只是作一个回显。然后,我们再用一个客户端向该服务器发起tcp连接,同样发送数据,这时看服务器会不会因为接收上一个连接的持续发送数据,而不能去处理第二个tcp连接的数据发送。

Read More

解惑js中的prototype

平时node中在人家源码里往往会看到prototype,之前百度了下说的是原型方法,也没有细看,今天决定好好把这块知识点学习一下。结合网上的资料,把prototype的定义精简一下:js中每个函数都有一个默认的prototype属性,这个属性是另一个对象(我们称之为‘原型对象’)的引用,换句话说,其实prototype属性就是一个对象。这个原型对象的所有属性和方法,都会被构造函数的实例继承。

说了定义,那我们来看什么时候使用prototype呢?这篇博文对这部分讲的很清楚。按照他的例子举个例,在传统的实例化出来的对象要使用属性或方法时,我们事先是这样构造一个‘类’(为了好理解暂叫类吧):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function Student(){
this.friends = []; //实例变量
this.read=function(){ //实例方法
var bookName = '代码与艺术';
console.log('我要读' + bookName);
}
}

var fengyun = new Student();
fengyun.friends.push('lauchunpung');
fengyun.read();
console.log(fengyun.friends); //['lauchunpung']

var andy = new Student();
andy.friends.push('zhuliqian');
andy.read();
console.log(andy.friends); //['zhuliqian']

Read More

常用的markdown标记

##Markdown
平常用markdown的时间不多,所以每次用它来写日志的时候都容易忘记,为此总结一些平常自己会经常用到的标记,方便查看(代码和效果同时附上),此后也会持续更新…

###图片
为致敬女神,图片格式放最前,^_^

1
![Alt text](/img/hexie.jpg "Optional title")


Read More

学习js中的this用法

通过这几个月在node.js上的工作,发现js其实并不是那么简单,而且感觉上越来越深,比如现在要笔记的一个坑——this,因为之前用过C++对this有一定的了解,其就是指向当前对象,而javascript中的this,因其弱语言的灵活性,它被赋予了更多的作用和使用范围。由于其运行期绑定的特性,它可以是全局对象、当前对象或者任意对象,这完全取决于函数的调用方式,下面根据网上的文章作了一个归纳,方便日后温习。

一般而言,在Javascript中,this指向函数执行时的当前对象,该关键字在Javascript中的执行环境,而非声明环境有关。

##1.作为单纯的函数调用

1
2
3
4
5
function modifyName(name) {
this.name = name;
}
modifyName('fengyun');
console.log(name);

Read More