关于事件驱动


最近接触到javascript,从语言设计上来说,这个语言还是很多优点的,虽然这些优点大多是借鉴其它语言的。其中,比较有意思的且非常重要的就是闭包了,这是早期的函数式语言(lispscheme等)的精髓,虽然在商业上,这些语言还是未能战胜过OO,但是,它们的思想在历史长河中永远不会消逝,会直接间接地影响现代语言

回到本文,本位主题里的事件驱动主要来自最近开始流行起来的node.js,比较有意思的是,这个语言让js有能力一统web前后端,设计原则里很重要的思想就是事件驱动。其实这本可以叫node.c/node.cpp/node.java/node.py等,可是作者却选择了js,这里是对于他的一个访谈,里面谈到了为什么他选择js的原因

让我总结就是:JavaScript中的闭包及第一类对象的函数,这些特性使JavaScript非常适合用作事件驱动编程

先来解释第一类对象,用我自己的话说就是:可以独立存在&可直接传递的实体,如大多数语言的整型等类型

js的函数是第一类对象,这就导致了:

  • 函数可以直接当作参数传递
  • 可以没有名字
  • 可以在函数里创建函数等

注意:这里请不要和c里的函数指针类比,设计层面上两个是不同的东西,即使某些情况下,可以达到类似效果

上面说的函数里创建函数,即是闭包的一个先决条件 网上关于闭包的定义和理解太多了,不过有一个总结我觉得很到位: 类是有行为的数据,闭包是有数据的行为

在OO里类可以实例化为一个对象,这个对象有很多属性,使用这些属性,对象可以有很多能力,这里的能力即函数,属性即一些静态变量

对于闭包的世界,所有一切都可以由动作来完成,根本不用分析具体构成,因为我们关心的仅仅是能做什么,而不是怎么做,所以由函数来主导世界是原生态的,符合人类行为的。闭包其实就是一个函数,这个函数能够感知利用它周围赋予它的一些物体,这里的物体即变量,闭包对于这里物体的承载方式是通过引用。所以,一个物体可以被多个函数引用,当没有函数引用时,则表示可以被回收的(垃圾回收机制是从函数式语言首创的)。ps:但是函数参数的传递却是值传递

再回到事件驱动,上边的讨论请不要一来就想着底层怎么实现的,这样很难理解,如果非要给给闭包评论,我更希望它是一种设计模式(c程序员是很难接受的)。所以这里的事件驱动我也不希望一来就关心底层怎么实现的,如果你非要我说,我只能告诉你,底层就是个死循环!

因为这个世界本身是异步的,所以在很多地方能看到事件驱动的例子,如前端/界面各种事件,web后台等,理解了这个再去学QT/Swing/Android/各种web后台框架等东西都是很容易了,无非注册事件,编写回调,这里的事件回调在不同环境下有不同的含义