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