There’s no criterion
Some people consider it functional if you ever pass a function as an argument. By this criteria even the C standard library is functional, because the sorting function accepts a comparator :)
Some people require such facilities as an effect system and good performance of persistent data structures. By this criteria only a handful of languages are functional: Haskell and (maybe) Idris.
So if one wants, he can make criteria arbitrarily stronger or weaker to include languages he likes or exclude languages he hates.
It’s that simple. If you like ML, you omit the effect system requirement so it becomes functional. If you hate ML - you add it. Or demand a stronger type system. Or whatever.
If you love JS, you adapt your definition accordingly. E.g. you define functional as having pretty decent lexical closures. If you hate JS, you can impose an arbitrary restriction to make it non-functional. Such as lack of mandatory tail call optimization.
I think the notion of a functional language will change over time as more functional languages become popular, so there are always two-three functional languages which are mainstream.