JavaScript中定义函数,通常会遇到以下两种写法:

写法A

1
2
3
function name1(){
//...
}

写法B

1
2
3
var name2 = function(){
// ...
};

这两种写法有什么区别呢?很久很久以前,stackoverflow上面有人问了一样的问题。

funciton的基本定义

首先,在JavaScript中function的最基本定义方法是写法A,这种定义的内容在脚本被编译时就会执行,生成一个有名字的函数对象。

而写法B实际上是定义了一个无名的函数对象,又将这个对象赋给了一个有名字的变量。
这种写法的存在,方便了我们将函数定义为对象的属性:

1
2
3
4
5
var target = new Object();
target.add = function(a,b){
return a+b;
};
target.add(1,1); //2

所以写法A定义的是一个完整的函数对象,而写法B定义的函数是没有名字的,name2是变量的名字,而不是函数的。

扩展

其实还可以使用new来声明函数:

1
var name = new Function("a", "b", "return a+b;");

这里注意使用的是Function而不是function,这是具体的定义了一个Function类型的对象。速度慢,只有在特定情况下使用,比如想要让用户去控制函数内容的时候。