1.什麼是函數聲明,函數表達式
函數聲明:function 函數名(){}
函數表達式:function 函數名(){}。函數名可寫可不寫。寫出來的,就是命名函數表達式,不寫的就是匿名函數表達式
例子:
function aaa(){};這就是函數聲明
var a=function aaa(){};命名函數表達式
var a=function(){};匿名函數表達式
下面的都是函數表達式
(function aaa(){})
~function aaa(){}
-function aaa(){}
+function aaa(){}
!function aaa(){}
2.差別
(1)函數表達式可以直接後面加括号執行,而函數聲明是不可以的。
function aaa(){alert(1);}();//函數聲明不可以,結果有錯誤
var a=function aaa(){alert(1);}();//函數表達式可以,結果彈出1
~function aaa(){alert(1);}();//函數表達式可以,結果也彈出1
(2)函數聲明可以被提前解析出來
如下面的例子:在火狐浏覽器中彈出的是1,但是在IE浏覽器中彈出的是2,但是函數表達式就不存在這樣的問題了。是以在這種情況下要用函數表達式。
if(true){
function aaa(){
alert(1);
}
}
else{
function aaa(){
alert(2);
}
}
aaa();
利用函數表達式:
if(true){
var a = function aaa(){
alert(1);
}
}
else{
var a = function aaa(){
alert(2);
}
}
a();//用aaa();可以嗎?no!
這時候彈出的都是1.
那麼問題來了,為啥不可以用aaa();因為這個aaa()在外面調用的話,是找不到的,但是在内部是可以找到的。
對于函數表達式,不要用;
var a=function aaa(){
alert(1);
alert(typeof aaa);
}
aaa();
結果顯示
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SNxYDN1YWMkJjZmNjZxMGNiBDN2I2NmVzY0kjM2gzY18CXyEzLchDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL1M3Lc9CX6MHc0RHaiojIsJye.png)
var a = function aaa(){
alert(1);
alert(typeof aaa); //内部是可以找到的
}
a();
/*aaa(); //外面是找不到的*/
總結:
函數聲明與函數表達式的差別?