js函數(shù)聲明和函數(shù)表達(dá)式的區(qū)別
簡(jiǎn)單來說球散,ECMAScript是通過上下文來區(qū)分這兩者的:假如 function foo(){} 是一個(gè)賦值語句或表達(dá)式的一部分都哭,則認(rèn)為它是一個(gè)函數(shù)表達(dá)式。而如果 function foo(){} 被包含在一個(gè)函數(shù)體內(nèi),或者位于程序(的最上層)中,則將它作為一個(gè)函數(shù)聲明來解析。顯然婆硬,在省略標(biāo)識(shí)符的情況下,“表達(dá)式” 也就只能是表達(dá)式了歉井。
函數(shù)聲明
function 函數(shù)名(){}
funciton fn(){}
函數(shù)表達(dá)式
function 函數(shù)名(可寫可不寫)(){} : 分別代表:命名函數(shù)表達(dá)式柿祈,匿名函數(shù)表達(dá)式
var bar = function foo(){}; // 表達(dá)式,因?yàn)樗琴x值表達(dá)(AssignmentExpression)的一部分
new function bar(){}; // 表達(dá)式哩至,因?yàn)樗荖ew表達(dá)式(NewExpression)的一部分
(function(){
function bar(){}; // 聲明躏嚎,因?yàn)樗呛瘮?shù)體(FunctionBody)的一部分
})();
(function foo(){}) 函數(shù)表達(dá)式,它被包含在一對(duì)圓括號(hào)中的函數(shù)菩貌,在其上下文環(huán)境中卢佣,
()構(gòu)成了一個(gè)分組操作符,而分組操作符只能包含表達(dá)式
var a = function(){} // 函數(shù)表達(dá)式
(function aaa(){}) // 函數(shù)表達(dá)式
~function aaa(){}
-function aaa(){}
+function aaa(){}
!function aaa(){}
二者區(qū)別
區(qū)別一
函數(shù)表達(dá)式可以直接在后面加括號(hào)執(zhí)行箭阶,而函數(shù)聲明不可以虚茶。也就是說,函數(shù)表達(dá)式可以通過直接加()來執(zhí)行這個(gè)函數(shù)
如:
function aaa(){alert(1)}(); // 這是不可以的
var a = function aaa(){alert(1)}(); // 可以的
~function aaa(){alert(2)}();
區(qū)別二
函數(shù)聲明提前
a(); //報(bào)錯(cuò)
var a = function(){
alert(1)
}
b(); //正常運(yùn)行
function b(){
alert(2)
}
區(qū)別三
作用域的區(qū)別
var a = function aaa(){
alert(1);
alert(typeof aaa); // 內(nèi)部可以找到
}
a(); // 1 function
aaa(); // 外部找不到 // 1