javascript function 不写函数名称和写函数名称区别(转载)

13年前

JavaScript中的Function对象是函数,函数的用途分为3类:

  1. 作为普通逻辑代码容器;
  2. 作为对象方法;
  3. 作为构造函数。

这里重点只讨论第二种。

创建函数实例的方式有3种:

    第一种是声明式,即像声明变量一样,将通过function(){}标识符创建的匿名函数直接赋值给变量,以该变量作为调用时的函数名称:

    第二种是定义式,即以function关键字后跟函数名称及(){}来直接定义命名函数,前面第一个multiply函数就是通过定义式创建的。

    第三种是构造函数式,即通过new运算符调用构造函数Function来创建函数。这种方式极不常用,因此就不作介绍了。

首先谈一下声明式:

var a = function () {
   alert("a");
}
a();
var a = function () {
   alert("aa");
}
a();

他们是没有带具体名称的函数,其结果是:a,aa....

再是定义式:

function b() {
   alert("b");
}
b();
function b() {
   alert("bg");
}
b();

他们都有自己的函数名称,其执行结果就不一样了。他们的结果是:bg、bg.这里的执行结果有些人就不清楚了,为什么会这样呢?这就要从JavaScript解释引擎机制上说了,当你知道了JavaScript解释引擎机制的时候你就会很轻松的能够理解这样的结果了。

JavaScript解释引擎机制的这样的:在采用定义式创建同名函数时,后创建的函数会覆盖先创建的函数。这种差别是由于JavaScript解释引擎的工作机制所导致的。JavaScript解释引擎在执行任何函数调用之前,首先会在全局作用域中注册以定义式创建的函数,然后再依次执行函数调用。由于注册函数时,后定义的函数重写了先定义的函数,因此无论调用语句位于何处,执行的都是后定义的函数。相反,对于声明式创建的函数,JavaScript解释引擎会像对待任何声明的变量一样,等到执行调用该变量的代码时才会对变量求值。由于JavaScript代码是从上到下顺序执行的,因此当执行第一个example()调用时,example函数的代码就是首先定义代码;而当执行第二个example()调用时,example函数的代码又变成了后来定义的代码。