基础js

js函数声明和函数表达式的区别

2017-11-27  本文已影响0人  该昵称注册中

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
上一篇下一篇

猜你喜欢

热点阅读