Functional programming cannot be performed in C. Functional programming cannot be performed in Java (without a lot of cumbersome workarounds for "almost" functional programming). Those and many more languages simply don't contain the constructs to support it. They are purely object-oriented and strictly non-functional languages.
At the same time, object-oriented programming cannot be performed on purely functional languages, such as Scheme, Haskell, and Lisp, just to name a few.
However, there are certain languages that support both models. Python is a famous example, but there are others: Ruby, Julia, and—here's the one we're interested in—JavaScript. How can these languages support two design patterns that are very different from each other? They contain the features required for both programming paradigms. However, in the case of JavaScript, the functional features are somewhat hidden.
But really, it's a little more involved than that. So what makes a language functional?
Characteristic | Imperative | Functional |
---|---|---|
Programming Style | Perform step-by-step tasks and manage changes in state | Define what the problem is and what data transformations are needed to achieve the solution |
State Changes | Important | Non-existent |
Order of Execution | Important | Not as important |
Primary Flow Control | Loops, conditionals, and function calls | Function calls and recursion |
Primary Manipulation Unit | Structures and class objects | Functions as first-class objects and data sets |
The syntax of the language must allow for certain design patterns, such as an inferred type system, and the ability to use anonymous functions. Essentially, the language must implement Lambda calculus. Also, the interpreter's evaluation strategy should be non-strict and call-by-need (also known as deferred execution), which allows for immutable data structures and non-strict, lazy evaluation.