1

What is the difference between the following two examples?

setInterval(myFunc, 100);function myFunc() { alert('asdf'); }

setInterval(myFunc, 100);var myFunc = function myFunc() { alert('asdf'); }
Brad Mace's user avatar
Brad Mace
28k19 gold badges110 silver badges152 bronze badges
askedJun 23, 2011 at 2:04
Andy Hin's user avatar
3
  • 2
    If you would have just typed the title of your question into the StackOverflow search box, you would have gotten many answers, like this one:stackoverflow.com/questions/5403121/…CommentedJun 23, 2011 at 2:41
  • There is only one declaration above, the rest are assignments of function expressions.CommentedJun 23, 2011 at 5:25
  • var myFunc = function myFunc() { alert('asdf'); } => create a variable named myFunc. No wait, create a function named myFunc. Now set the variable to = myFunc the function. Now get rid of the function.CommentedJun 23, 2011 at 5:53

4 Answers4

4

According to ECMA standard, the first example is a functionstatement while the second is a functionexpression. According to Javascript a function statement counts as a definition, which means in the first example it is visible through the entire function (or script if it's not in a function). But in the second example,var myFunc will not have the value offunction myFunc until the second line, and therefore setInterval will be passedundefined.

The only syntax difference between function statements and expressions is that statements are not included in are larger expression: eg:(function foo() {}) is an expression, whilefunction foo() {} is a statement.

NB: I believe old IE (pre 9?) treated all function expressions as definitions.

To expound on this answer, consider the following code:

    <script language="javascript">        alert(A);        alert(B);        function A() {return "A value";}        var B = function B(){ return "B value";}        alert(A);        alert(B);    </script>

this will alert (in order):

  1. Function A()...
  2. undefined
  3. Function A()...
  4. Function B()...
Tremmors's user avatar
Tremmors
2,98619 silver badges13 bronze badges
answeredJun 23, 2011 at 2:15
Simon Buchan's user avatar
Sign up to request clarification or add additional context in comments.

5 Comments

I expected the second example to fail on thesetInterval part, for the same reason you gave. But when I tried it (in IE) it worked. Even if thevar myFunc part is hoisted above, doesn't the actual assignment happen inline there after thesetInterval? I'm confused.
@nnnnnn: I think IE 9 standards mode fixed this, but checking up on this, it looks like IE has treated all function expressions as statements, so the second is equivalent tofunction myFunc() {...} setInterval(...); var myFunc = myFunc;
thanks. I thought it might be a weird IE thing, but IE(7) was all I had access to for a quick test. And (d'oh) I just saw the "NB" about IE at the end of your post that somehow I missed on first reading.
-1 for calling a FunctionDeclaration and "function statement". There is no such thing as a "function statement" in ECMAScript. There is aFunctionDeclaration andFunctionExpression described in ECMA-262 §13.
@RobG: Uhh, thanks for the clarification, it makes it easier to look up, but is thatreally a -1? A definition is (a specific type of) a statement, after all.
0

Both samples are essentially doing the same thing. In the second example, you can also use a named function with a different name or an unnamed function.

var myFunc = function myOtherName() { alert('asdf'); }

or

var myFunc = function() { alert('asdf'); }

They are all the same.

answeredJun 23, 2011 at 2:14
JasonG's user avatar

Comments

0

In the first example:

> setInterval(myFunc, 100);> > function myFunc() { alert('asdf'); }

The function declaration is processed before any code is executed, somyFunc exists as a local parameter whensetInterval is called.

The second example:

> setInterval(myFunc, 100);> > var myFunc = function myFunc() {> alert('asdf'); }

works for exactly the same reason:myFunc is declared usingvar and therefore exists as a local variable whensetInterval is called.

Edit

Ooops! It doesn't work. The value ofmyFunc is evaluated whensetTimeout is called, and at that pointmyFunc hasn't bee assigned a value so an error results. Changing the value later doesn't affect the value held bysetTimeout.

Finally, there is no such thing as a "function statement". ECMA-262 definesFunctionDeclaration andFunctionExpression in §13, there is no other kind of function.

answeredJun 23, 2011 at 5:42
RobG's user avatar

Comments

-1

in the first example, you actually assign a newly created variable "myFunc" with a function data type. So, "myFunc" is the name of the variable, and function is the data type. The first one is the same as this:

var myFunc = function(){alert('asdf');}

I have never seen anything like in the second example. I dont know if its even a valid way to declare a function...

answeredJun 23, 2011 at 2:10
Benny Tjia's user avatar

1 Comment

I just tested it (in firefox) and the second example is a function mechanism of declaring a function. It seems to be declaring the function myFunc and then assigning a reference to that to the variable myFunc. But this is executing in line, whereas the first example declares the function before linear code execution begins.

Your Answer

Sign up orlog in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

By clicking “Post Your Answer”, you agree to ourterms of service and acknowledge you have read ourprivacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.