Javascript函数式编程语言(3)

它的真实身份可以追溯到它的原型:Scheme和Lisp,两个经典的函数式编程语言。Javascript一直都是一个函数式编程语言。 它的函数是头等公民,并且可以嵌套,它具有闭包和复合函数,它允许珂理化和monad。所有这些都是函数式编程的关键。 这里另外还有一些Javascript是函数式语言的原因:

• Javascript的词法包括了传递函数为参数的能力,具有类型推断系统,支持匿名函数、高阶函数、闭包等等。 这些特点对构成函数式编程的结构和行为至关重要。

• Javascript不是一个纯面向对象语言,它的多数面向对象设计模式都是通过拷贝Prototype对象来完成的, 这是一个弱面向对象编程的模型。欧洲电脑制造商协会脚本(ECMAScript)——Javascript的正式形式和标准实现 ——在4.2.1版本的规范里有如下陈述:
“Javascript不具有像C++、Smalltalk、Java那样的真正的类,但是支持创建对象的构造器。 一般来说,在基于类的面向对象语言里,状态由实例承载,方法由类承载,继承只是针对结构和行为。 在EMACScript里,状态和方法由对象来承载,结构、行为和状态都会被继承。”

• Javascript是一个解释型语言。Javascript的解释器(有时被称为“引擎”)非常类似于Scheme的解释器。 它们都是动态的,都有易于组合和传输的灵活的数据类型,都把代码求值为表达式块,处理函数的方式也类似。

也就是说,Javascript的确不是一个纯函数式语言。它缺乏惰性求值和内建的不可变数据。 这是由于大多数解释器是按名调用,而不是按需调用。Javascript由于其尾调用的处理方式也不太善于处理递归。 不过所有的这些问题都可以通过一些小的注意事项来缓和。需要无穷序列和惰性求值的非严格求值可以通过一个叫Lazy.js的库来实现。 不可变量只需要简单的通过编程技巧就可以实现,不过它不是通过依赖语言层面来限制而是需要程序员自律。 尾递归消除可以通过一个叫Trampolining的方法实现。这些问题将在第六章讲解。

关于Javascript是函数式语言还是面向对象语言还是两者皆是还是两者皆非的争论一直都很多,而且这些争论还要继续下去。

最后,函数式编程是通过巧妙的变化、组合、使用函数而实现编写简洁代码的方式。而且Javascript为实现这些提供了很好的途径。 如果你真要挖掘出Javascript全部的潜能,你必须学会如何将它作为一个函数式语言来使用。

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wggypx.html