Javascript是一种函数式编程语言吗?

时间:2010-10-18 19:27:45

标签: javascript functional-programming terminology

仅仅因为函数是第一类对象,有闭包和高阶函数,Javascript是否应该被称为函数式编程语言?我认为它缺少的主要功能是纯函数,它并不像其他函数式语言那样'感觉',比如lisp(虽然这不是一个很好的理由,因为它不是一个功能性的语言......)

13 个答案:

答案 0 :(得分:171)

重复my own answer个问题,

  

没有公认的定义   函数式编程语言。

     

如果将功能语言定义为   支持头等舱的语言   函数和lambdas,然后是,JavaScript *是* a   功能语言。

     

如果你也考虑像这样的因素   支持不变性,代数   数据类型,模式匹配,部分   应用程序等然后没有,JavaScript   *不是*函数式语言。

     
     

我鼓励你阅读   以下相关博客文章(以及   他们下面的评论):

     

答案 1 :(得分:25)

我会说这是一种多范式的语言。

编辑:这是多范式,包括功能结构。

答案 2 :(得分:15)

如果你将“函数式编程”这个术语拉伸并扭曲到哲学讨论的角度,这个问题可能会再次开放。然而,那么你最终会达到诸如“C ++真的是一种编程语言”这样有用的问题吗?

每日更多问题的回答是“不”

功能编程意味着程序被概念化为功能的评估,而不是控制流程。代码是函数的描述,并没有控制流的固有概念。

JavaScript有一个控制流程,被概念化为命令式语言。从设计目标来看,它显然不是一种功能语言。

答案 3 :(得分:8)

“函数式编程”这个术语如今过载太多,几乎没用。有两个主要含义:

  1. 拥有一流的功能
    • Javascript就是这个!
  2. 基于lambda演算中使用的函数,重点是避免持久的可变状态(通常用传递给函数的参数替换它)
    • 正如通常所写,Javascript不是远程的!
  3. 选择你的意思然后问题是可以回答的。

答案 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))