js函數聲明和函數表達式的區別
簡單來說,ECMAScript是通過上下文來區分這兩者的:假如 function foo(){} 是一個賦值語句或表達式的一部分,則認為它是一個函數表達式。而如果 function foo(){} 被包含在一個函數體內,或者位于程序(的最上層)中,則將它作為一個函數聲明來解析。顯然,在省略標識符的情況下,“表達式” 也就只能是表達式了。
函數聲明
function 函數名(){}
funciton fn(){}
函數表達式
function 函數名(可寫可不寫)(){} : 分別代表:命名函數表達式,匿名函數表達式
var bar = function foo(){}; // 表達式,因為它是賦值表達(AssignmentExpression)的一部分
new function bar(){}; // 表達式,因為它是New表達式(NewExpression)的一部分
(function(){
function bar(){}; // 聲明,因為它是函數體(FunctionBody)的一部分
})();
(function foo(){}) 函數表達式,它被包含在一對圓括號中的函數,在其上下文環境中,
()構成了一個分組操作符,而分組操作符只能包含表達式
var a = function(){} // 函數表達式
(function aaa(){}) // 函數表達式
~function aaa(){}
-function aaa(){}
+function aaa(){}
!function aaa(){}
二者區別
區別一
函數表達式可以直接在后面加括號執行,而函數聲明不可以。也就是說,函數表達式可以通過直接加()來執行這個函數
如:
function aaa(){alert(1)}(); // 這是不可以的
var a = function aaa(){alert(1)}(); // 可以的
~function aaa(){alert(2)}();
區別二
函數聲明提前
a(); //報錯
var a = function(){
alert(1)
}
b(); //正常運行
function b(){
alert(2)
}
區別三
作用域的區別
var a = function aaa(){
alert(1);
alert(typeof aaa); // 內部可以找到
}
a(); // 1 function
aaa(); // 外部找不到 // 1