仅仅因为函数是第一类对象,有闭包和高阶函数,Javascript是否应该被称为函数式编程语言?我认为它缺少的主要功能是纯函数,它并不像其他函数式语言那样'感觉',比如lisp(虽然这不是一个很好的理由,因为它不是一个功能性的语言......)
答案 0 :(得分:171)
重复my own answer个问题,
没有公认的定义 函数式编程语言。
如果将功能语言定义为 支持头等舱的语言 函数和lambdas,然后是,JavaScript *是* a 功能语言。
如果你也考虑像这样的因素 支持不变性,代数 数据类型,模式匹配,部分 应用程序等然后没有,JavaScript *不是*函数式语言。
我鼓励你阅读 以下相关博客文章(以及 他们下面的评论):
答案 1 :(得分:25)
我会说这是一种多范式的语言。
编辑:这是多范式,包括功能结构。
答案 2 :(得分:15)
如果你将“函数式编程”这个术语拉伸并扭曲到哲学讨论的角度,这个问题可能会再次开放。然而,那么你最终会达到诸如“C ++真的是一种编程语言”这样有用的问题吗?
每日更多问题的回答是“不”。
功能编程意味着程序被概念化为功能的评估,而不是控制流程。代码是函数的描述,并没有控制流的固有概念。
JavaScript有一个控制流程,被概念化为命令式语言。从设计目标来看,它显然不是一种功能语言。
答案 3 :(得分:8)
“函数式编程”这个术语如今过载太多,几乎没用。有两个主要含义:
选择你的意思然后问题是可以回答的。
答案 4 :(得分:3)
我认为函数式编程没有具体的定义,但人们认为“函数式编程”的许多内容都可以用javascript完成。这是article.
中的一个很好的简短示例答案 5 :(得分:2)
对我而言,Javascript既是命令式语言又是功能语言,您可以选择以任何方式使用它,甚至( egad )两种方式。或者你可以选择使用一种范例,而不是接触另一种范例。由你决定。我和你一样,不认为Javascript应该被称为一种功能语言,因为它允许你进入和退出功能编程范例。也许如果它有某种类型的pragma,限制你只使用函数式编程范例,那么这将是有用的,我认为。但是,总而言之,我说它更像是一种命令式/过程式语言,其中包含一些函数式编程功能。
答案 6 :(得分:2)
我倾向于不认为编程语言有一个特定的范例,但他们适合某些范例。然而,仅仅因为它们适合某种特定范式并不意味着你必须使用这种范式。用C编写面向对象的程序并在ML中编写命令式程序是完全可能的。没有使用某种范式来解决问题,因为语言不是为它而设计的,只是人为限制自己(当然,在决定某个特定解决方案是否是一个好的解决方案时,你仍然应该考虑语言的局限性)。
答案 7 :(得分:0)
好吧,我不会说它是函数式编程,但是我会说它是面向对象的,而今天朋友说他也不会把它放在那个架子上。
所以,虽然我不会说,但我觉得还有发表意见的空间。它确实具有函数式编程的经典特性,它没有其他特性。
答案 8 :(得分:0)
Javascript是有道理的。这真的取决于你如何编程。如果我以OO方式编码,它不是OO吗?因此,如果您只是以“功能”方式对事物进行编码,那么它就会起作用。我想这是多范式语言,所以称之为一件事并不完全准确。
答案 9 :(得分:0)
@petraszd 我稍微重写了一下你的代码,以获得 运算符的:
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]())
})
但我知道这种方式对于大循环有缺点......
Related question about tail recurtion optimization in JS
P.S。发布在这里cuz在发布为评论时有代码格式的问题
答案 10 :(得分:0)
在Javascript中,你可以做这样的事情!!
// Data
var fruits = [
{ name: 'apple', price: 5 },
{ name: 'orange', price: 10 },
{ name: 'lemon', price: 15 }
]
// Request Data from magicURL
request('magicURL')
.then(selectKeyOf('price'))
.then(priceMethod('sum'))
.then((result)=>{
console.log(result) // 30
})
我已经制作了github page来演示这个概念,你可以克隆/查看我的实现
答案 11 :(得分:0)
正如我们所知,函数式编程语言不允许更改或改变函数的元素(状态),但在javascript中允许它在某种意义上它不是函数式编程语言,尽管它确实将函数视为头等公民。
答案 12 :(得分:-2)
我真的很讨厌javascript(如果你试着把它当作FP语言)是这样的:
function getTenFunctionsBad() {
var result = [];
for (var i = 0; i < 10; ++i) {
result.push(function () {
return i;
});
}
return result;
}
function getTenFunctions() {
var result = [];
for (var i = 0; i < 10; ++i) {
result.push((function (i) {
return function () {
return i;
}
})(i));
}
return result;
}
var functionsBad = getTenFunctionsBad();
var functions = getTenFunctions()
for (var i = 0; i < 10; ++i) {
// using rhino print
print(functionsBad[i]() + ', ' + functions[i]());
}
// Output:
// 10, 0
// 10, 1
// 10, 2
// 10, 3
// 10, 4
// 10, 5
// 10, 6
// 10, 7
// 10, 8
// 10, 9
您需要了解JS堆栈环境(如果是正确的术语,我不会理解这种行为)。
在例如方案中你只是不能产生这样的东西(好的,好的 - 借助底层语言的参考你可以制作它):
(define (make-ten-functions)
(define (iter i)
(cond ((> i 9) '())
(else (cons (lambda () i) (iter (+ i 1))))))
(iter 0))
(for-each (lambda (f)
(display (f))
(newline)) (make-ten-functions))