本篇博客记录的是自己《nodejs高级编程》的笔记,内容非常基础= =
定义:当感兴趣的事件发生时由系统调用的函数来取代应用返回值的编程风格被称为事件驱动编程或者异步编程,这个是node的显著特征。
在阻塞式的I/O编程中:
result = query(sql_command);
do_something_with(result);
而在事件驱动系统中,上述擦查询则会变成这样:
query_finished = function(){
do_something_with(result);
}
query(sql_command, query_finished);
事件驱动编程和事件循环相伴相生,事件循环是一个处于不间断循环中的结构,该结构主要有两项功能——事件检测和事件触发处理,在每一轮循环中,它都必须检测发生了什么事件。当时间发生时,事件循环还要决定带哦用那个回调函数
简单复习一下什么是闭包:闭包就是函数,但是它可以继承并访问它自生被声明的那个作用域里的变量。在被调用时,回调函数会记住他自身声明时所在的上下文,并且可以访问该上下文及其父上下文里的所有变量,这个强大的特性是node成功的核心。
有时候在web端的js代码的书写时,为了避免全局变量的污染,将代码包装在函数中以额外创建闭包是一个很常用的方法
(funtion() {
var clickcount = 0;
$('button').click(function() {
++clickcount;
alert("the button has been clicked " + clickcount + " times");});
});
}());
在这里,最外面的function是很临时的,它一被声明后就被调用,这是一种常见的js模式:
通过创建函数来创建新的作用域
在js中,函数操作不是孤立地工作而是会记住它被声明时的上下文,这能让function操作其声明时所在的上下文以及父上下文中的所有变量。
所以在上述例子中,虽然回调函数在jq的click()里面被调用的,但是它依然可以访问或操作clickcount。这样有两个好处:
- 将状态变量传递给函数而不必维护它就能进行事件驱动编程(一种程序流程取决于事件发生的编程分割)
- js闭包为你维护状态变量