无废话JavaScript教程(全集)第3/4页

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

五、函数式
这个可不是JavaScript的发明,它的发明人已经死了,而他的这个发明还在困扰着我们……如同爱迪生的灯
泡还在照耀着我们。
其实函数式语言很简单,它就是一种与命令式语言同样“完备”的语言实现方案。由于它的基础思想与命令
式——如果你不想用这个难于理解的名词,那就把它换成C,或者Delphi好了——语言完全不同,所以大多数
情况下,它也与这些传统的、通用的、商业化的语言格格不入。
而事实上,你天天都在用它。
下面这行代码,就充满了函数式语言的思想:
a + b
是吗?真的,如果你把那个“+”号看成一个函数,就完全一样了。事实上,所谓函数(function),就是一个
执行过程、一段运算、一个功能入口……也就是说,代码中的某个东西,要么它是数据,要么它是运算。而如
果它是运算,你就可以把它看成“函数”。上面这行代码——表达式中,a和b显然是数据,而+号则是对之进
行操作的运算,所以它自然可以看成一个“功能、过程或运算”。所以……操作两个数求和的“函数”可以写
成这样:
func_add(a, b)
或者这样:
(+ a b)
所有这些,只是文字上的标记法不同而已。就好象我说这个符号是“jia”,而你非得说它是“暗得”,另一个
人却非要读作“a-d-d”。有什么不同吗?没有。
所有程序员天天都在写语句,写表达式,与运算逻辑。大家都知道这些东西都可以写在一个……嗯……无比巨
大的函数里,或者分在无数个小的、看起来很漂亮的函数里。当所有这些函数一个又一个连续起来运算时,它
就成了“函数式语言”。所以称为“函数式语言的祖老爷爷”的LISP就是这样“把函数运算连起来”的语言:
复制代码 代码如下:

(defun subst (x y z)
(cond ((atom z)
(cond ((eq z y) x)
('t z)))
('t (cons (subst x y (car z))
(subst x y (cdr z))))))

有人认为它是丑陋的意大利面条,也有人认为它是最简洁的语言。Oh,随你,了解了就好了,管它象什么尼。
由于函数式语言只有连续执行的函数——所以它没有了“语句”而又必须实现逻辑上的完整性。简单地说,他
需要在连续执行的过程中实现“顺序、分支与循环”三个基本逻辑。函数式的解决之道,是用三元条件运算来
代替if/then/else,也就下面的代码:
if a then b else c
// 相当于
a ? b : c
另外,就是用递归(函数调函数)来实现循环。考虑到递归函数调用中会导致栈溢出(Stack overflow at ...),
所以函数式语言就提出了“尾递归”,也就是在书写代码是“确保”仅只在函数内的最后一个运算中递归调用。
这样一来,这个递归调用就不需要保留栈了——因为再没有后续运算了,因此就能被优化成一行不需要返回的
jmp汇编指令。
世界真美好,所谓函数式不过是一堆运算入口,以及jmp、jmp、jmp。但,但是,难道不是吗——这块CPU?
六、更高级的函数式(1)
其实世界并不美好。
如果一块CPU死躺在那里,它也就只有顺序呀、分支啦、循环之类的指令在里头。但是当它运行起来,就得有一
个时钟在滴嗒…滴嗒…如果是多核的,还会同时有好几个这样的东东在滴嗒着。
这就是问题,世界原本不是单一时序,也不是守序的。所以会有并发,会有中断,也会有异常。函数式语言应
该自己应该像意大利面条一样无限延展开去,那么是不是有多个滴嗒时就该有多根意大利面条呢?但,这种情
况下还叫意大利面条吗?
函数式里的解决方案叫延续(Continuation)和结点。延续是停止当前转到另一处、然后再返回来;而结点则确
保一个位置上的代码是独立完备的,与另一个结点无关。在函数式语言中,多个结点就象平行宇宙,大多数情
况下它们是互相透明的,如果它们要发生联系,得需要极其巨大的能量,以及……一个虫洞。
多个结点的问题我们不需要深究,多个空间下的访问带来的时空问题,是天体学家以及时空多维理论家们研究
的问题,我们只需要知道:如果你希望多个结点之间存在交叉的访问关系,那么世界/宇宙会因此毁灭。这样类
似的说明写在ErLang这类天生支持多个宇宙的语言的白皮书、参考手册以及宇航员日常指南之中。如果你要穷
究其根源,并且认为自己已经能明确了解300个以上的高等数字、物理学和天体学术语,地么下面有一份面向程
序员的入口指引,不妨从这里开始:

相关文章

  • JavaScript计算出现精度丢失问题的解决方法

    JavaScript计算出现精度丢失问题的解决方法

    Javascript作为一门大型编程语言,在日常开发中难免会涉及到大量的数学计算,然而,浮点数在计算过程中可能出现精度的问题,下面我们就来学习一下Javascript中高精度计算及其相关知识吧
    2023-11-11
  • 将input框中输入内容显示在相应的div中【三种方法可选】

    将input框中输入内容显示在相应的div中【三种方法可选】

    本篇文章主要介绍了在input框中输入内容,会相应的显示在下面的div中的不同做法:js方法;jQuery方法;AngularJs方法,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-05-05
  • JavaScript中boolean类型之三种情景实例代码

    JavaScript中boolean类型之三种情景实例代码

    下面小编就为大家带来一篇JavaScript中boolean类型之三种情景实例代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • 精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)

    精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)

    这篇文章主要为大家分享了一个精彩的Bootstrap案例,涉及到了选项卡、栅格布局,关键重点在注释,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • js中的document.querySelector()方法举例详解

    js中的document.querySelector()方法举例详解

    这篇文章主要给大家介绍了关于js中document.querySelector()方法的相关资料,document.querySelector是JavaScript中的一个内置方法,用于通过CSS选择器选择文档中的第一个匹配元素,需要的朋友可以参考下
    2024-01-01
  • JS中call和apply函数用法实例分析

    JS中call和apply函数用法实例分析

    这篇文章主要介绍了JS中call和apply函数用法,结合实例形式较为详细的分析了call和apply函数继承功能的使用方法、区别及操作注意事项,需要的朋友可以参考下
    2018-06-06
  • 微信小程序获取用户openid的实现

    微信小程序获取用户openid的实现

    这篇文章主要介绍了微信小程序获取用户openid的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • 小程序实现可拖动的悬浮按钮

    小程序实现可拖动的悬浮按钮

    这篇文章主要为大家详细介绍了小程序实现可拖动的悬浮按钮,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • javascript数组的定义及操作实例

    javascript数组的定义及操作实例

    在文章里小编给大家整理的是关于javascript数组的定义及操作的相关知识点,需要的朋友们学习下。
    2019-11-11
  • 微信小程序实现底部弹窗

    微信小程序实现底部弹窗

    这篇文章主要为大家详细介绍了微信小程序实现底部弹窗,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07

最新评论