Last active
December 11, 2015 20:29
-
-
Save jackfranklin/4655886 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// what are the key differences between: | |
var foo = function() { | |
alert("Hello World"); | |
}; | |
// and | |
function foo() { | |
alert("Hello World"); | |
} |
- It won't always be obvious the scope of the latter, the function declaration, whereas it is much easier to know the scope of the former, the function expression.
- You cannot declare the function inside a block (like an if) – or rather, you should not, because behaviour is not consistent across browsers.
- The declaration will have the 'name' property set to 'foo'.
- Using Function.toString on the declaration will include the name – the expression will be an anonymous function.
I'm sure there are more...
@davemackintosh would you explain your reasoning behind:
function foo () {};
var foo = foo;
I don't really see the benefits of doing that over just var foo = function() {}
.
Just to clarify my first statement:
var a = 1;
function b() {
a = 10;
return;
function a() {}
}
b();
alert(a);
Produces '1' – which is logical but totally unintuitive because it's not always clear that function declarations are hoisted. Rewritten it makes much more sense:
var a = 1;
function b() {
a = 10;
return;
var a = function() {}; // var a is hoisted, so a = 10 alters local scope 'a'
}
b();
alert(a);
Resulting in:
var a = 1;
function b () {
var a;
a = 10;
return;
a = function() {}; // var a is hoisted, so a = 10 alters local scope 'a'
}
b();
alert(a);
I worded it badly, but I'm saying it's not as clear what's going on.
@jackfranklin or even var foo = function foo() {}
?
foo is defined at parse time so can be used and var foo is just an alias at run time (i used foo but could be "bar") I dont use it often was just an example of how to get best of both worlds.
Try running:
foo(); // runs the parse time code
function foo () {alert('hello')};
var foo = foo;
foo(); // runs the runtime code.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
First function is Function Expression
Second function is Function Declaration