考虑到函数声明VS函数表达式,这个问题就出现了。
我们清楚地知道函数声明具有此形式
function foo() {
var a = 3;
console.log( a );
}
虽然函数表达式可以具有这种形式(看起来像已知的立即调用函数表达式)
(function foo() {
var a = 3;
console.log( a );
})()
查看立即调用的函数表达式,我可以注意到包含在parethesis中的第一个函数(函数声明中使用的函数)。
现在,重点是:我知道分组运算符(通常称为" parethesis"())只能包含表达式。如果这是真的,我不能说函数声明也是一个函数声明(因为它就像是说我在括号中包含了一个语句......)。
那么,你能提供一些帮助吗,我有点困惑。 函数声明也是一个函数声明?如果是,括号中的函数是一个语句还是什么?
我必须澄清一点,我不是在询问函数声明和函数表达式之间的区别。如果我提到它们,它们的区别仅仅是描述我的问题:a"函数声明"也是一个"函数声明"?
答案 0 :(得分:3)
虽然函数表达式的语法与函数声明相同,但它们并不相同。
函数声明中使用的名称范围与命名函数表达式不同。当你写:
function foo() {
var a = 3;
console.log( a );
}
foo
的范围是封闭函数(如果它处于顶层,则为全局环境)。
当你写:
(function foo() {
var a = 3;
console.log( a );
})
foo
的范围只是函数的主体。
解析器根据上下文确定它是函数表达式还是声明。由于语句不能在括号内,因此在括号内加上括号会强制它成为表达式。
答案 1 :(得分:1)
在表达式中不会发生吊装,但在功能声明中会发生吊装。
在函数语句中,您可以在函数调用之前或之后在js文件中的任何位置编写函数定义。 JIT编译器将在编程文件的顶部提升。
对于函数表达式,JIT编译器不会像函数语句那样执行,函数语句读取它发生的位置。如果您尝试在定义之前访问函数,它将显示类型错误。
IIFE是主要用于避免访问变量外部功能的模式。
callMe(); // Function statement
function callMe(){
return console.log("I am function statement");
}
// callMe2(); // TypeError if you call before expression defined.
var callMe2 = function(){
return console.log("I am function expression");
};
callMe2(); //Function expression call
(function(){
return console.log("I am IIFE");
}());