JavaScript 中定义函数的方式有两种,一种是函数声明,另一种是函数表达式。这两种定义方式之间有一些细微的差别。

1.函数声明:

    function 关键字 + 函数名字 + 函数体构成了函数声明,具体形式如下:

function functionName(arg0, arg1, arg2) {
  // function body
}

Firefox Safari Chrome Opera 都给函数定义了一个非标准的 name 属性,通过这个属性可以访问到给函数指定的名字:

alert(functionName.name);//"functionName"

关于函数声明的一个重要特征就是函数声明提升(function declaration hoisting,意为在执行代码前会先读取函数声明,也就是说可以在函数声明前调用函数:

sayHello();//"Hello"
function sayHello() {
  alert("Hello~");
}

 

2.函数表达式:

函数表达式有点类似常规的变量赋值语句,这种情况下创建的函数叫做匿名函数(anonymous function),具体形式如下:

var functionName = function(arg0, arg1, arg2) {
  // function body
};

函数表达式与函数声明主要有两点不同,一是由于函数表达式定义的为匿名函数,因此该变量的 name 属性是空字符串:

alert(functionName.name);//""

二是函数表达式没有函数声明提升这一特性,因此不能再函数表达式前调用函数:

sayHello();//error
var sayHello = function() {
  alert("ello~");
};

 

看一个例子,帮助我们更好地理解一下函数声明函数表达式:

代码片段一:

if (condition) {
  function sayHello() {
    alert("Hello version_1");
  }
} else {
  function sayHello() {
    alert("Hello version_2");
  }
}

表面上看,以上代码表示在 condition true 时,使用一个 sayHello() 的定义,否则就使用另一个定义。但是这种方式很危险,可能会有意想不到的结果,但是,如果使用函数表达式,就没有什么问题了,如下代码片段:

代码片段二:

var sayHello;
if (condition) {
  sayHello = function() {
    alert("Hello version_1");
  };
} else {
  sayHello = function() {
    alert("Hello version_2");
  };
}