代码之家  ›  专栏  ›  技术社区  ›  hvgotcodes

Javascript是函数式编程语言吗?

  •  128
  • hvgotcodes  · 技术社区  · 14 年前

    13 回复  |  直到 12 年前
        1
  •  178
  •   Community CDub    8 年前

    重复 my own answer

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

    支持头等舱的语言 函数和lambdas,那么是的,JavaScript*is*a 功能语言。

    如果你也考虑到 支持不变性,代数 数据类型,模式匹配,部分 应用程序等,然后不是,JavaScript *不是功能性语言。


    关注相关的博客文章(以及 下面的评论:

        2
  •  26
  •   Niki Yoshiuchi    14 年前

    我认为它是一种多范式的语言。

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

        3
  •  15
  •   shuhalo    14 年前

    如果你把“函数式编程”这个术语延伸和扭曲到哲学讨论的地步,这个问题可能会再次开放。但是,你最终会发现一些有用的问题,比如“C++真的是一门编程语言”吗?

    “不” .

    函数式编程是指程序被概念化为对函数的评估,而不是控制流。代码是对函数的描述,没有控制流的固有概念。

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

        4
  •  8
  •   Chuck    14 年前

    “函数式编程”这一术语现在已经超负荷了,几乎没用了。主要有两种含义:

      • 这就是Javascript!
      • 正如通常所写的,Javascript并不是远程的!

    选择你的意思,然后这个问题是可以回答的。

        5
  •  3
  •   marknery    12 年前

    我不认为函数式编程有什么具体的定义,但是人们认为“函数式编程”可以用javascript来完成。这里有一个简单的例子 article.

        6
  •  2
  •   Brian Onn    14 年前

    对我来说,Javascript既是一种命令式语言,又是一种函数式语言,你可以选择以任何一种方式使用它,甚至( egad公司 )两种方式。或者你可以选择使用一种模式,而不去碰另一种。这取决于你。一、 和你一样,不要认为Javascript应该 打电话 一种函数式语言,因为它允许你在函数式编程范式中徘徊。也许如果它有某种类型的pragma,以限制您只使用函数式编程范式,那么我认为这将非常有用。但是,总而言之,我认为它更像是一种命令式/过程式语言,其中包含一些函数式编程特性。

        7
  •  2
  •   David Brown    14 年前

    我倾向于不认为编程语言有一个特定的范例,但它们适合于某些范例。然而,仅仅因为它们适合某个特定的范式并不意味着你必须使用该范式。用C语言编写面向对象的程序和用ML语言编写命令式程序是完全有可能的。不使用特定的范例来解决问题,因为语言不是为它而设计的,只是人为地限制了自己(当然,在决定是否使用特定的解决方案时,您仍然应该考虑到语言的局限性一个好的解决方案)。

        8
  •  0
  •   salezica    14 年前

    我不认为这是函数式编程 假设它是面向对象的,就在今天,一个朋友说他也不会把它放在那个架子上。

        9
  •  0
  •   user372743 user372743    14 年前

    Javascript就是这样。这完全取决于你如何编程。如果我以面向对象的方式编写代码,这不是面向对象吗?所以如果你只是用一种“功能性”的方式来编写代码,它就会是功能性的。我想这是一种多范式的语言,所以说它只是一件事并不完全正确。

        10
  •  0
  •   Community CDub    8 年前

    @佩特拉斯兹德 对于 操作员:

       
       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、 因为作为评论发布时代码格式有问题

        11
  •  0
  •   Wayne Chiu    8 年前

    在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 为了演示这个概念,您可以克隆/查看我的实现

        12
  •  0
  •   Sourabh Ranka    7 年前

        13
  •  -2
  •   petraszd    14 年前

    我最讨厌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堆栈环境(如果它是正确的术语,我不知道)才能理解这种行为。

    例如,在scheme中,您不能生成这样的东西(Ok,Ok——借助于底层语言的引用,您可以生成它):

    (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))