龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > Javascript编程 >

Node.js中的事件驱动编程详解_node.js(2)

时间:2014-08-25 11:04来源:网络整理 作者:网络 点击:
分享到:
用这些框架做开发,需要学习框架相关的特定知识以及框架特定的类库,比如,使用Event Machine时,为了享受非阻塞带来的好处,你得避免使用同步类库,

用这些框架做开发,需要学习框架相关的特定知识以及框架特定的类库,比如,使用Event Machine时,为了享受非阻塞带来的好处,你得避免使用同步类库,只能用Event Machine的异步类库。如果你使用了任何阻塞类库(比如Ruby的大多数标准库),你的服务器就失去了最佳的伸缩性,因为事件循环依然会不断地被阻塞,时不时地阻碍了I/O事件的处理。

Node最初就被设计成一个非阻塞I/O服务器平台,因此一般情况下,你应该期望运行在它上面的所有代码都是非阻塞的。因为JavaScript非常小,而且它不强制使用任何I/O模型(因为它没有标准的I/O类库),因此Node建立在一个很纯净的环境里,不会有什么历史遗留问题。

Node和JavaScript如何简化了异步应用程序

Node的作者Ryan Dahl,最初使用C来开发这个项目,但是发现维护函数调用的上下文太复杂,导致代码复杂度很高。然后他转用Lua,但是Lua已经有个几个阻塞的I/O类库,阻塞和非阻塞混在一起可能会让开发人员很迷惑并因此阻碍了很多人构建可伸缩的应用,于是Lua也被Dahl抛弃了。最后他转向了JavaScript,JavaScript中的闭包及第一级对象的函数,这些特性使JavaScript非常适合用作事件驱动编程。JavaScript的魔力是让Node如此流行的一个主要原因。

什么是闭包

闭包可以理解为一个特殊的函数,但是它可以继承并访问它自身被定义的那个作用域里的变量。当你将一个回调函数作为参数传递给另外一个函数时,它稍候会被调用,神奇的是,这个回调函数被稍候调用时,它居然记住了它自身定义所在的那个上下文以及父上下文里的变量,而且还可以正常访问它们。这个强大的特性是Node成功的核心。

下面的例子将展示在Web浏览器里JavaScript闭包是如何工作的。假如,你要监听一个按钮的单机事件,你可以这样做:

复制代码 代码如下:

var clickCount = 0;

document.getElementById('myButton').onclick = function() {

        clickCount += 1;

        alert("clicked " + clickCount + " times.");

};

使用jQuery时是这样:

复制代码 代码如下:

var clickCount = 0;

$('button#mybutton').click(function() {

        clickedCount ++;

        alert('Clicked ' + clickCount + ' times.');

});

JavaScript里,函数是第一类对象,就是说你可以把函数当作参数来传递给其他函数。上面的两个例子,前者把一个函数赋值给另一个函数,后者把函数作为参数传递给另一个函数,单击事件的处理函数(回调函数)可以访问函数定义所在代码块下的每个变量,在这个例子里,它可以访问在它父闭包内定义的clickCount变量。

clickCount变量处在全局作用域(JavaScript里最外层的作用域),它保存了用户点击按钮的次数,通常在全局作用域下存储变量是个坏习惯,因为那样很容易跟其他代码冲突,你应该把变量放在使用它们的本地作用域里。大多时候,只用把代码用一个函数包装起来,等于另外创建了闭包,这样就可以很容易避免污染全局环境,就像这样:

复制代码 代码如下:

                  (function() {

                            var clickCount = 0;

                            $('button#mybutton').click(function() {

                                     clickCount ++;

精彩图集

赞助商链接