Two ways of declaring functions

Neeraj Singh

By Neeraj Singh

on March 15, 2010

All the JavaScript books I read so far do not distinguish between following two ways of declaring a function.

1var foo = function () {};
2function foo() {}

Thanks to Ben today I learned that there is a difference .

When a var is used to declare a function then only the variable declaration gets hoisted up

1function test() {
2  foo();
3  var foo = function () {
4    console.log("foo");
5  };
6}
7test();

Above code is same as one given below.

1function test() {
2  var foo;
3  foo();
4  foo = function () {
5    console.log("foo");
6  };
7}
8test();

When a function variable is declared without var then both variable declaration and body gets hoisted up

1function test() {
2  foo();
3  function foo() {
4    console.log("foo");
5  }
6}
7test();

Above code is same as one given below.

1function test() {
2  var foo;
3  foo = function () {};
4  console.log(foo());
5}
6test();

Conclusion

Now it will be clear why foo() does not work in the following case while bar() does work.

1function test() {
2  foo(); // TypeError "foo is not a function"
3  bar(); // "this will run!"
4  var foo = function () {
5    // function expression assigned to local variable 'foo'
6    alert("this won't run!");
7  };
8  function bar() {
9    // function declaration, given the name 'bar'
10    alert("this will run!");
11  }
12}
13test();

Stay up to date with our blogs. Sign up for our newsletter.

We write about Ruby on Rails, ReactJS, React Native, remote work,open source, engineering & design.