我们可以定义一个"函数声明"也作为"功能声明"?

时间:2017-11-14 17:20:13

标签: javascript

考虑到函数声明VS函数表达式,这个问题就出现了。

我们清楚地知道函数声明具有此形式

function foo() { 
    var a = 3;
    console.log( a );
}

虽然函数表达式可以具有这种形式(看起来像已知的立即调用函数表达式)

(function foo() { 
    var a = 3;
    console.log( a );
})()

查看立即调用的函数表达式,我可以注意到包含在parethesis中的第一个函数(函数声明中使用的函数)。

现在,重点是:我知道分组运算符(通常称为" parethesis"())只能包含表达式。如果这是真的,我不能说函数声明也是一个函数声明(因为它就像是说我在括号中包含了一个语句......)。

那么,你能提供一些帮助吗,我有点困惑。 函数声明也是一个函数声明?如果是,括号中的函数是一个语句还是什么?

我必须澄清一点,我不是在询问函数声明和函数表达式之间的区别。如果我提到它们,它们的区别仅仅是描述我的问题:a"函数声明"也是一个"函数声明"?

2 个答案:

答案 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");
}());