函数式语言要求做到,函数内的运算对函数外无副作用。但是事实上JavaScript没能做到这一点。它允许在函数内部引用和修改全局变量,甚至可以声明全局变量。除此之外,JS也允许在函数内修改对象和数组的成员,这使得函数并不是仅仅通过它的返回值来影响系统。这些其实是破坏它的函数式特性的。
可见Js并不是一种纯粹的函数式语言。 这样的设计有好处和弊病吗? 更灵活了,但是稳定性会有下降?
JavaScript的函数仍然是有副作用的。
函数式语言中的函数,和我们平常说的函数有些不同(
不同于普通语言,如C、Pascal中所谓的函数),它们通常是指 源于 lamda演算而实现的函数。
已经证明,λ演算的计算能力和 图灵机是等价的。
现有JS引擎实现,都不支持
尾递归,这种机制可以使用 函数来完成 大量的递归而不影响效率。
如果用递归函数来完成一些循环,
会消耗很多的栈,以用于保存 上下文和中间值。 会造成很大的性能损耗。
对函数调用的栈也有了更深入的理解一些 函数式语言,都已经实现了 尾递归,和相应的 优化机制。 它们只在函数的最后语句完成一次跳转, 不用保存中间变量,不会造成栈溢出的问题。 Erlang就是支持这种机制的。