145

Just because functions are first class objects, there are closures, and higher order functions, does Javascript deserve to be called a Functional Programming language? The main thing I think it lacks is Pure Functions, and it doesn't 'feel' like other functional languages, like lisp (although thats not really a good reason for it not to be a functional langauge...)

hippietrail
  • 15,848
  • 18
  • 99
  • 158
hvgotcodes
  • 118,147
  • 33
  • 203
  • 236
  • 1
    Common Lisp people sometimes seem not to like thinking of Lisp as a "functional" language. – Pointy Oct 18 '10 at 19:32
  • It can access global variables that may affect/change the outcome of other functions, denying the value/function replacement requirement. So, no it is not a functional programming language. – slashmais Oct 18 '10 at 19:35
  • 12
    @slashmais: No! That only prevents it from being a pure(ly) functional language. ML (at least modern dialects) are impure, too - but noone would dare to call them not functional ;) –  Oct 18 '10 at 19:47
  • 4
    There are plenty of languages that are commonly considered functional, but which aren't pure. I don't see how that's a requirement. If you want to be that strict, then most so-called OOP languages aren't OOP either. You end up with about 95% of all languages being no-paradigm languages. – jalf Oct 18 '10 at 19:58
  • 7
    Why does it matter though? When I code in C++, I don't care if the language "is OOP" or not. I care that it has certain OOP features, and that it has a couple of functional programming features, and a lot of imperative programming features, and a lot of generic programming features. But whether it "is-a" OOP language or a FP language or something else doesn't matter. Likewise when I code in JS, it doesn't matter if it is FP or not. What matters is that it supports a lot of nice FP features. It seems this is the wrong question to ask. – jalf Oct 18 '10 at 20:06
  • @jalf, i agree with the sentiment. I just get an eye twitch when people mention JS and then say functional programming language -- most thinks its functional programming language because functions are objects.... – hvgotcodes Oct 19 '10 at 17:03
  • 3
    @hvgotcodes: so? There's absolutely no rule saying it isn't. My rule of thumb is that it is a functional language if you can use it to program in a functional style. Since Javascript has first-class functions, closures and lambdas, I believe you can, and so as far as I'm concerned, it's a functional language. Not a pure one, obviously, but neither are most of the languages we typically consider FP (SML for example). So really, I think you just need to loosen up. If that makes your eye twitch, you need to see a doctor. – jalf Oct 19 '10 at 17:11
  • 3
    @jalf, absolutely. The motivation for the question was i wanted to know what my peers and people who are smarter than me think. – hvgotcodes Oct 19 '10 at 17:18
  • Its OK for the answer to be 'it has some Functional Language features, and it is missing some' – hvgotcodes Oct 19 '10 at 17:19
  • There's no apple in the world that is 100% red. – KMA Badshah Aug 10 '21 at 00:45

15 Answers15

188

Repeating my own answer to a similar question,

There's no accepted definition of functional programming language.

If you define functional language as the language that supports first class functions and lambdas, then yes, JavaScript *is* a functional language.

If you also consider the factors like support for immutability, algebraic data types, pattern matching, partial application etc then no, JavaScript *is not* a functional language.


I'd encourage you to read the following related blog posts (and also the comments below them):

Community
  • 1
  • 1
missingfaktor
  • 90,905
  • 62
  • 285
  • 365
  • 1
    Later versions of Mozilla's implementation of JavaScript (staring with 1.7) have pattern matching in the form of destructuring assignments: https://developer.mozilla.org/en/New_in_JavaScript_1.7#section_20 – jbeard4 Oct 18 '10 at 21:34
  • JavaScript has the notion of partials, and partially applying parameters, so I wonder if your statement that it does not support this is incorrect? – johnbakers Oct 14 '13 at 02:43
  • 3
    @OpenLearner, partial application is supported by pretty much every language I can think of, even C. For a certain definition of "support" anyway. The case with JS is no different. The point is whether partial application is effortless and first class in that language. In JS, it isn't. If you're curious about what I mean, take a look at OCaml or Haskell. – missingfaktor Oct 14 '13 at 07:28
  • JavaScript supports immutability afaik. – fka Oct 22 '13 at 06:01
  • @fka, can you expand on what you mean? – missingfaktor Oct 23 '13 at 05:49
  • @missingfaktor Constants. Do-nothing getter/setters. Seal and Freeze methods. But that's all newer ecma5 JS you won't see in browsers regularly until a lot of old IEs have passed away. We've been able to encapsulate instance vars in an object that could only be accessed with a getter method since pre-2000 I would guess. Of course, that's immutability support in the same sense that Java can emulate first class functions with one-method objects. – Erik Reppen Dec 11 '13 at 02:01
  • So would java be considered functional as well since they added lambda support in java 8 or something? Or is that lambda different from the lambda you are talking about? – theprogrammer Jan 24 '22 at 19:20
27

I would say that it is a multi-paradigm language.

EDIT: It's multi-paradigm and includes functional constructs.

Niki Yoshiuchi
  • 16,883
  • 1
  • 35
  • 44
  • yeah, I agree it's a mix and several different things. – Ashley Grenon Oct 18 '10 at 19:37
  • 6
    but that doesn't answer the question of whether it is **also** functional. Being multi-paradigm implies supporting multiple paradigms. Is one of these paradigms functional programming? – jalf Oct 18 '10 at 20:01
18

if you stretch and twist the term "functional programming" to the point of philosophical discussions, this question may be open again. However, then you end up on the level of useful questions like "Is C++ really a programming language"?

The answer to your question on more daily level is "no".

Functional programming means that the program is conceptualized as a evaluation of a function, rather than a control flow. The code is a description of functions, and has no inherent concept of a control flow.

JavaScript has got a control flow and is conceptualized as a imperative language. From its design objective, it is clearly not a functional language.

shuhalo
  • 5,732
  • 12
  • 43
  • 60
  • 1
    design objective? What do you mean? Last I checked, one of its sources of inspiration was Scheme. I'd say it's pretty clear that one of its design objectives was to support functional programming *as well* as a bucketful of other paradigms – jalf Oct 18 '10 at 20:04
  • 2
    It supports functional programming as much as C++ does, if you write appropriate foundations for this by yourself - as much as you can emulate imperative syntax in, say, Haskell with a little work. Nevertheless the syntax of JavaScript leads to it being thought of a a work flow rather than the evaluation of a function. For that reason, I (or most functional programmers) regard applying the term "functional" as too extensive. – shuhalo Oct 18 '10 at 20:11
  • @user411768: so you're saying that whether or not a language is functional depends on the design of its standard library? I've never heard *that* definition before. Java has most of the tools needed to program in a functional style (closures and anonymous functions, for example), which C++ (currently) doesn't. I think that makes JS a lot more FP than C++ is. The fact that the language doesn't *force* you to program in a FP style doesn't make it "less functional", does it? – jalf Oct 19 '10 at 17:13
  • 1
    (i) The standard library is a part of the standard, just as the syntactical features are, and emphasizes a certain idiomatic and conceptual style. E.g. "C++ with STL" is very different from "C with classes". It has an impact. (ii) JavaScript features object orientation, first-class-citizen functions - the features are rather orthogonal to the imperativ/functional-dichotomy. However, neither does it directly implement currying, nor does it provide purity, nor has it ever been intended for this. (iii) My last words on that, see first paragraph of the post. – shuhalo Oct 19 '10 at 23:27
  • 4
    The statement that JavaScript and C++ offer the same functional programming conveniences is certainly wrong. JavaScript makes functional programming quite straightforward and simple without all of the messy constructs you must go through in C++ to achieve the same thing. There are plenty of great C++ coders who prominently say that functional programming is really not encouraged in C++, however articles on doing functional programming in JavaScript abound plentiful – johnbakers Oct 14 '13 at 02:47
10

The term "functional programming" language is so overloaded these days it's almost useless. There are two dominant meanings:

  1. Has first-class functions
    • Javascript is this!
  2. Is based on functions as used in the lambda calculus, with an emphasis on avoiding persistent mutable state (often replacing it with parameters passed to functions)
    • As commonly written, Javascript is not remotely this!

Pick your meaning and then the question is answerable.

Chuck
  • 234,037
  • 30
  • 302
  • 389
  • Is there a source which uses "functional programming" to refer to languages with functions being first-order citizens?. – shuhalo Oct 18 '10 at 19:54
  • @user411768: Actually, another answerer linked to Wikipedia's article, which uses that definition. http://en.wikipedia.org/wiki/Javascript — Joel Spolsky also implied this definition in his "Can your programming language do this?" post on the benefits of "functional programming" – Chuck Oct 18 '10 at 20:05
  • You note that, as commonly written, JavaScript is not using your second point, but that certainly doesn't mean that there aren't programmers doing exactly that, and that the language doesn't support such a feature, because it certainly does – johnbakers Oct 14 '13 at 02:49
  • @OpenLearner: Well, yeah, but the same is true of Java and lots of other languages that are generally considered to be strictly imperative — you *can* write them in a functional style, but it's not the language's happy path. – Chuck Oct 14 '13 at 19:58
  • ... but the latest JS would support it. – Erik Reppen Dec 11 '13 at 02:03
3

I don't think there a concrete definition of functional programming , however many of things people consider "functional programming" can be done with javascript. Here is a good brief example in this article.

marknery
  • 1,533
  • 3
  • 19
  • 27
2

To me, Javascript is both an imperative language and a functional language, and you can choose to use it either way, and even (egad) both ways. Or you can choose to use one paradigm and never touch the other. It's up to you. I, like you, don't think Javascript should be called a Functional Language, because it allows you to wander in and out of the functional programming paradigm. Perhaps if it had a pragma of some kind, to limit you using only functional programming paradigms, then that would be useful, I think. But, in summary, I say it's more of a imperative/procedural language with some functional programming features tossed in.

Brian Onn
  • 1,026
  • 11
  • 18
  • By that reasoning, F# can no long be called functional. – Eric Mickelsen Oct 18 '10 at 19:45
  • 1
    Right. According to Wikipedia, F# is exactly what I just called Javascript: "F# [...] is a multi-paradigm programming language [...] that encompasses functional programming as well as imperative object-oriented programming disciplines" – Brian Onn Oct 18 '10 at 20:42
2

I tend not to think of programming languages as having one particular paradigm, but that they lend themselves to certain paradigms. However just because they lend themselves to a particular paradigm doesn't mean you have to use that paradigm. It's quite possible to write object oriented programs in C and write imperative programs in ML. Not using a certain paradigm to solve a problem because the language isn't designed for it is just artificially limiting yourself (of course you should still take into account the limitations of a language when deciding if a particular solution will be a good solution).

David Brown
  • 13,336
  • 4
  • 38
  • 55
0

@petraszd I rewrite your code a little to obtain a "new" for operator:

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

But I know that this way has disadvantages for big loops...

Related question about tail recurtion optimization in JS

P.S. Posted here cuz have problem with code formatting while posting as comment

Community
  • 1
  • 1
æ-ra-code
  • 2,140
  • 30
  • 28
0

Javascript is to a point. It truly depends on how you go about programming it. If I code in an OO manner, would it not be OO? So if you just code things in a 'functional' manner it would be functional. I guess it is multi-paradigm language so to call it just one thing isn't entirely accurate.

  • You can generally program in just about any style in any language if you try hard enough. It seems more meaningful to talk about what paradigm the language is designed for, and to what extent. JS wasn't designed to be a functional language any more than most of its contemporaries, Perl, PHP, Ruby, Python and so forth. It's a multi-paradigm language with some functional features, notably first-class functions. I don't think this is enough to be able to call the language "functional" any more than being able to swim makes something a fish. – ggorlen Sep 15 '21 at 22:01
0

As we know the functional programming language doesn't allow to change or mutate the elements(state)of functions but in javascript it is allowed in that sense it is not a functional programming language, although it does treat function as first class citizens.

0

First, we have to define functional programming. I define it as any language that natively supports and privileges the style of programming shared by canonical (or at least widely agreed-upon) functional languages like Scheme, Racket, Haskell or Clojure.

Other languages, like OCaml, Elixir and Scala have much deeper functional support than JS, but still tend to be considered multi-paradigm. Functionalness is a spectrum.

All of this is very much open to endless debate and nitpicking, but this definition seems solid enough to make the case that JS isn't a serious functional language and probably never will be one any more than any other modern, multi-paradigm language with first-class functions.

Let's pick a specific feature. The language should perform tail call optimization so you can natively write recursive functions on linear data structures. Almost all major implementations of JS fail to offer this fudamental feature that we'd expect from a typical "functional" language (by the above definition) and have no plans to at the time of writing (see Are functions in JavaScript tail-call optimized? for details).

Let's give the benefit of the doubt and toss in TCO and still, JS fails to offer even a slight hint of the immutability design goal you'd expect of a "true" functional language. Just getting const in the language took decades, and all objects are mutable by default.

These problems can't really be completely resolved due to backward compatibility; it's not really possible to turn an established multi-paradigm language into a truly functional language after the fact.

JS is about as functional as, say, Python, Perl, PHP or Ruby which all offer map/filter/reduce operations on lists and support first-class functions or procedures. The existence of first-class functions offers enough of an opening to write code that is in a functional programming style. Toss in trampolines and ramda.js and it might seem convincing at a glance.

The question is whether first-class functions are sufficient to make the language "functional". In fact, Wikipedia lists all of the aforementioned as functional languages, but then, that list includes just about every popular, modern, general-purpose language other than C and Go (including at least one that explicitly identifies as not functional by design) so I don't see that this definition offers much distinguishing value.

ggorlen
  • 44,755
  • 7
  • 76
  • 106
0

There is an interesting paper, well developped (pure functions, partial application, currying ...) and illustrated with many short examples, here: https://www.freecodecamp.org/news/functional-programming-in-javascript/

allez l'OM
  • 547
  • 4
  • 13
-1

Well, I wouldn't say it's functional programming, but then I would say it's object oriented and just today a friend said he wouldn't put it on that shelf either.

So, while I wouldn't say it is, I guess there's room for opinion. It does have classical features of functional programming, it doesn't have others.

salezica
  • 74,081
  • 25
  • 105
  • 166
-2

In Javascript, you can do something like this!!

// 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
    })

I have made a github page in order to demo this concept and you can clone/view my implementation

Wayne Chiu
  • 5,830
  • 2
  • 22
  • 19
-4

What I really hate in javascript (if You try to look at it as FP language) is this:

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

You need to understand JS stack environment (I don't if it is the right term) to understand such a behavior.

In scheme for example You just can't produce such thing (Ok, ok -- with the help of underlying languages' references You can make it):

(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))
petraszd
  • 4,249
  • 1
  • 20
  • 12