Simply put a semicolon (;
) after console.log(
…)
.
Explanation
The error is easily reproducible like this:
It’s trying to pass function(){}
as an argument to the return value of console.log()
which itself is not a function but actually undefined
(check typeof console.log();
). This is because JavaScript interprets this as console.log()(function(){})
. console.log
however is a function.
If you didn’t have the console
object you’d see
ReferenceError: console is not defined
If you had the console
object but not the log
method you’d see
TypeError: console.log is not a function
What you have, however, is
TypeError: console.log(...) is not a function
Note the (...)
after the function name. With those it’s referring to the return value of the function.
Respect the ;
All these code snippets result in all sorts of unexpected errors if no semicolons are present:
console.log() // As covered before() // TypeError: console.log(...) is not a functionconsole.log() // Accessing property 0 of property 1 of the return value…[1][0] // TypeError: console.log(...) is undefinedconsole.log() // Like undefined-3-3 // NaN
Another Example
You see the (...)
oftentimes with the use of chained methods or chained property accessors:
string.match(/someRegEx/)[0]
If that RegEx isn’t found, the method will return null
and the property accessor on null
will cause a TypeError: string.match(...) is null
— the return value is null
. In the case of console.log(...)
the return value was undefined
.