仅仅因为函数是一等对象,有闭包和高阶函数,JavaScript就应该被称为函数式编程语言吗?我认为它主要缺少的是纯函数,并且它不像其他函数式语言(比如lisp)那样“感觉”像函数式语言,虽然这不是不能成为函数式语言的好理由...
仅仅因为函数是一等对象,有闭包和高阶函数,JavaScript就应该被称为函数式编程语言吗?我认为它主要缺少的是纯函数,并且它不像其他函数式语言(比如lisp)那样“感觉”像函数式语言,虽然这不是不能成为函数式语言的好理由...
重复我自己的答案来回答类似的问题:
关于函数式编程语言,还没有一个被广泛接受的定义。
如果您将函数式语言定义为支持一级函数和lambda的语言,则JavaScript *是*函数式语言。
如果您还考虑了诸如支持不可变性、代数数据类型、模式匹配、部分应用等因素,那么JavaScript *不是*函数式语言。
我鼓励您阅读以下相关博客文章(以及这些文章下面的评论):
我认为它是一种多范式语言。
编辑:它是一种多范式语言,包含函数式结构。
如果你将"函数式编程"这个术语扭曲到哲学讨论的程度,那么这个问题可能会再次成为争议。但是,那时你就陷入了像" C++ 真的是一种编程语言吗?"这样的无用问题。
更日常的回答是 "不是"。
函数式编程意味着程序的概念化是作为函数的评估,而不是控制流。代码是函数的描述,并且没有固有的控制流概念。
JavaScript 具有控制流并且被概念化为命令式语言。从它的设计目标来看,它显然不是一种函数式语言。
"函数式编程"这个词现在已经被过度使用,几乎毫无意义。它有两个主要含义:
根据您选择的含义,问题就可以得到答案了。
@petraszd 我稍微改写了你的代码,以获得一个“新”的for运算符:
function ffor(a, b, f){
function it(i){
if(i > b)return
f(i)
it(i+1)
}
it(a)
}
print("----" + new Date()+"----")
var funcs = []
ffor(0, 9, function(i){
funcs.push(function(){return i})
})
ffor(0, 9, function(i){
print(funcs[i]())
})
P.S. 发布在这里是因为在发布评论时有代码格式问题
让我们给予怀疑的态度,加入TCO,但JS仍然无法提供即使是微不足道的不可变性设计目标,这是你期望从“真正”的函数式语言中得到的。在语言中引入const
花费了数十年的时间,所有对象默认都是可变的。
由于向后兼容性,这些问题实际上无法完全解决;在事后将已经建立的多范式语言转变为真正的函数式语言并不是真正可能的。
JS与Python、Perl、PHP或Ruby一样具有功能性,它们都在列表上提供map
/filter
/reduce
操作,并支持一级函数或过程。一级函数的存在为编写以函数式编程风格的代码提供了足够的机会。加入trampolines和ramda.js,一眼看去可能会让人信服。
Javascript有其局限性。它的编程方式取决于你如何去编写代码。如果我以面向对象的方式编写代码,那么它不就是面向对象的吗?所以,如果你只是以“函数式”的方式编写代码,那么它就是函数式的。我想这是一种多范式语言,所以仅仅称之为一种语言并不完全准确。