无废话JavaScript教程(全集)

 更新时间:2008年10月07日 23:28:35   作者:  
许多读者认为我那本《JavaScript语言精髓与编程实践》读来辛苦,所以我一直想写个简单的读本。索性,这次就写个最简单的吧。

http://www.blogjava.net/canonical/archive/2007/12/05/165664.html
延续是解决状态问题的方法之一。简单说来,有时间就有状态:有过去,现在和将来。对于过去,我们有历史,也就会因为过去发生了什么而决定现在发生什么,例如因为昨天喝高了小酒,所以今天只能吃稀粥;而现在也就是明天的昨天,所以要为了明天能做什么而记录下今天的状态,例如今天已经吃了稀粥;至于明天,当然,将要发生的事情很多,我们得一件一件地做好准备。
Oh,重要的就是这个“做好准备”了。这在计算机系统里叫:事件。或者叫计划,或者叫突发。知道为什么我们的PC机可以运行吗?En...是因为有一个指令流水线在按照一个足够微小的时间片去执行指令。对于运算系统来说,这个定时发生的指令访问行为,就是中断。所以有一天一个朋友问我:如果执行逻辑只有顺序、分支与循环,那么流程系统中的触发器算什么?我想了很久,无解。而现在来回答这个问题,就得把“时间”这个维度加上,所谓突发、并发以及类似的东西,是时序概念下的逻辑。
好了,当我们“做好准备”,为了将来要触发某个东西做准备的时候——简单的说,就当是个时钟处理程序好了(在windows中它叫OnTimer,在浏览器中它叫setTimeout/setInterval),为了这个时候我们能够在函数式语言中做好一顿意大利面条,我们说明:“我们已经做好了准备”,以及“我们做好了怎样的准备”。而按照函数式的基本原则,一个函数是与状态无关的,它与“将来”这样一个时序无关。这,变成了一个矛盾。
事实上开始我们已经与这个矛盾正面冲突了一次,这就是“循环”。因为循环需要一个状态量来指示循环进度,
这个“进度”就是时序相关的。而函数式使用了“递归”来解决它,也就是通过递归函数的参数来传递这个进度。在“递归参数”——这个界面的两边,函数式都是时序无关的。由此带来的问题就是栈溢出,解决方法则是尾递归;又由此带来的问题就是编程复杂性,以及能否证明尾递归能替代所有递归;解决方案是……温伯格说得没错,所有解决问题的方法都会带来新的问题。Oh...又是温伯格。 现在,我们明确的需要“更多的状态”了,因为我们已经将系统运行一个或是多个的时序里——也就CPU。即使我们有结点,而且保证“没有虫洞”,那么我们也需要解决一个CPU中的过去、现在与将来的问题。
函数式的仙家们说了两个字:持续。简单啊,就是把为过去、现在的状态,和为将来的准备作为函数的参数传过去。看起来,“现在”立即就要爆炸了,因为既要包括过去的、现在的状态以及变化,还要包括将来的运算。于是新的解决方案是:若要现在不爆炸,"持续"的界面上不要发生运算就好了。
运算由“将来”根据“过去”的数据做决策,这就是持续。支持它的函数式特性,就是在惰性求值。简单的说,
function f(x, c) {
...
c(x);
}
f(data, f);
由于在传送界面f()上,c本身是不求值的,所以爆炸会发生在/不会发生都是在将来c(x)进行运算的时候。如果
宇宙的熵有极限,那么这个极限也是在末可知的将来。而且,在末可知的将来,也有可能回扭曲回现在。这就是
持续的两个原则:
--------------------
一个成功持续之后,是一个新的持续(或过程)
一个失败持续将回到上一个选择点
--------------------
正是因为有持续的状态,且这个状态及持续本身都是通过函数参数传递的,所以,“回到选择点”只是将来自身
的一个决择,与现在的状态是无关的。
七、更高级的函数式(2)
无论如何,种种函数式的复杂性,确实是在编程范型中保持一种自我的纯粹性而存在的。例如生成器(产生器)
这个问题,由于一批数据的产生之间是有关系的(例如增量),而产生过程是时序相关的(不总是在一次调用中
得到全部的数据),因此函数式语言定义了一个“生成器”这样的函数概念。我们可以在生成器中定义一个yield,
这个返回就是“将来”回到这个“现在”的一个虫洞。通过这个虫洞,我们可以拿到一个时序相关的数据。下面
就是这样的一个例子(mozilla上的斐波那契数列示例):
<!-- for firefox 3 -->
<script type="application/javascript;version=1.7">
function fib() {
var i = 0, j = 1;
while (true) {
yield i; //<-虫洞在这里
var t = i;
i = j;
j += t;
}
}
var g = fib();
a = g.next();
b = g.next();
c = g.next();
// ...
// .. 三天以后(或一个循环以后),某时空旅行家想回到fib里去看看
z = g.next();
// 呵,原来是值“2”
alert(z);
</script>
八、结语
好象,好象这篇《无废话》有很多废话……哈哈,玩笑啦,真的全无废话,还是活人能看的木?
真的那么想读无废话,你应该去读大学教材了。或者,这里还有一本《JavaScirpt语言精髓与编程实践》。
看见木,语言……精髓哦……,哈哈。

相关文章

最新评论