函数表达式和函数声明

  1. 函数声明(Function Declaration):

    • 形如function <function_name> () {},四个元素缺一不可
    • 不能够是表达式的其中一部分
  2. 函数表达式(Function Expression):

    • 最常见的形式:var func = function () {}
    • 函数表达式一般是赋值表达式的一部分,不能单独存在。
    • 有时候,会给函数加上名字,像这样var func = function f() {},但这实际上没什么用,跟用匿名函数赋值var func = function() {}是一样的。
      1
      2
      var func = function f() {};
      f(); // Uncaught ReferenceError: f is not defined
    • 还有一种函数表达式,存在于自执行函数(self-invoking function)中。比如,下面这种形式,也是函数表达式。
      1
      2
      3
      (function sayHello() {
      alert("hello!");
      })();

两者之间的异同

  • 同:这两个方法都能创建出一个函数,并且这个函数的名字都叫foo
  • 异:
    1. 函数声明的方法,存在变量提升的情况,也就是会将这个函数声明提升到作用域最前面。于是,在函数声明前,就能调用这个函数。
      函数表达式的方法,其实也存在变量提升的情况,只不过先声明,但给这个变量赋值为undefined。在函数声明前调用这个函数就会报错。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      (function () {
      a(); // a
      b(); // Uncaught TypeError: b is not a function
      function a() {
      console.log("a");
      } // 函数声明
      var b = function () {
      console.log("b");
      }; // 函数表达式
      })();
    2. 函数声明的方法定义的函数,可以被放入执行环境的变量对象(Variable Object)中;而函数表达式定义的函数,不会被放入执行变量的