The setTimeout
function expects a function reference* as an argument: references are variables, and don’t have parentheses.
Function calls require parentheses (even if the function takes no parameters).
Nutshell: myFunction
is a reference to the function. myFunction()
executes the function, and in an expression, will “equal” the function’s return value (or undefined
if nothing is returned).
Digging Deeper: There are circumstances where setTimeout(myFunction(), 1000)
might make sense, like if myFunction()
itself returns a function. For example:
var myFunction = function() {
return function() {
alert("ohai");
};
};
- The anonymous function (containing a single
return
statement) is executed immediately. - The return value of that function is itself a function containing an
alert
.
So:
myFunction
alone is a reference to a function (that happens to return a function).myFunction()
will execute. It evaluates to a function reference, suitable forsetTimeout()
.
Finally:
setTimeout(myFunction(), 1000);
This calls myFunction()
‘s return value in one second. One second later, up pops the alert.
See also Why function statement requires a name?
* Or a string to be evaluated, but a reference is preferred.