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
网友评论