这是两个非常容易搞混的概念,这里我们总结一下两者的不同
下图非常形象的说明了函数声明的形式
最为主要的特点就是,使用函数声明的方式声明函数,必须强制性的为函数设置一个名称,这个名称作为代码中调用此函数的唯一方式。
另外,函数声明必须是独立的,如下面的代码就是正确的函数声明
function f1(){
console.log('f1');
}
下面代码中的f1和f2都是正确的函数声明
function f1(){
console.log('f1');
function f2(){
console.log('f2');
}
}
函数表达式也用来声明函数,但是函数表达式一般都写道其他表达式中,如下面的代码
var f1=function(){
console.log('f1');
}
中的
function(){
console.log('f1');
}
就叫做函数表达式
函数表达式也可以作为其他函数的参数或者返回值
function f1(n,callback){
return callback(n);
}
var res=f1(3,function(){
return 3*3;
})
console.log(res);
当然函数表达式也可以作为函数的返回值。
总结:
- 在代码中的位置不同:函数声明都是独立的;函数表达式一般处于其他表达式中
- 名称是否可选:函数声明中,函数名称是强制的;函数表达式中,函数名称完全是可选的
- 调用方式不同:使用函数名称+(参数列表)的方式调用函数声明方式声明的函数;调用函数表达式声明的函数则有两种方式
方式1:使用变量名称引用,其实这与直接为函数添加名称差不多
var f1=function(){
console.log('f1');
}
//调用
f1();
方式2:立即调用,如果希望马上执行,可以使用下面的语法
(function(){console.log('f1');})();
当然也可以传递参数
(function(n){console.log(n);})(3);
为什么要将函数表达式使用()括起来?
如果不包含起来,引擎在督导 function 的时候,会以为这是一个函数声明,而function关键字后面又没有函数名称,所以语法上会报错。