How come I can say:
var myFunction = function() {
setTimeout(myFunction, 1000);
}
myFunction();
Why does the function call in the setTimeout
not require a parenthesis, but the last line does?
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");
};
};
return
statement) is executed immediately.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 for setTimeout()
.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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With