函数表达式和函数声明

在ECMAscript,最常用的两种方法来创建一个函数是一个函数的表达式和函数的声明,这两个时期之间的差异是有点晕,因为ECMA规范只明确了一点:函数的声明必须有标识符(标识符)(即我们常说的函数名称),你可以省略函数表达式中的标识符:

函数声明:

函数函数名(参数:可选){函数体}

函数表达式:

函数函数名(可选)(参数:可选){函数体}

所以我们可以看到,如果我们不声明函数名,它必须是一个表达式。如果我们声明函数的名称,我们怎么说它是函数声明或函数表达式ECMAscript是语境的区别,如果函数(Foo){ }是一个赋值作为它的一部分,它是一个函数表达式,如果函数(Foo){ }是包含在身体的一个函数,或是在上面,它是一个函数声明。


函数,因为它是程序的一部分
var(=){函数;因为它是赋值的一部分
新函数(bar){ };表达式,因为它是一个新表达式
(函数(){())
函数(bar){语句,因为它是函数体的一部分。
})();


还有一个函数表达式是不太常见的,是括号括起来(函数),他之所以表示的原因是因为括号()是一个分组运算符,它只能包含内部表达式,我们来看看几个例子:

函数声明函数声明

(函数(富){);函数包含在分组操作符中

命名函数表达式

Mention named function expressions, behoove is its name, VAR bar, the previous example (foo = function) {}; is a valid named function expressions, but it is important to remember that this name is valid only in the function scope defined in the specification, because the specified identifier cannot be in effect the periphery of the effective domain:


函数(){
返回类型Foo; / / foo是有效的范围内
};
外部不可见
console.log(类Foo); / / 的定义
Console.log((f)); / / 功能
函数(){
在范围内有效
};
外部不可见
console.log(类Foo); / / 的定义
console.log(F)(= = F); / / 功能
console.log(f.name); / / Foo


那么,命名法有什么用呢你为什么要被点名

正如我们在开始时所说的,给它一个名字是因为它可以使调试过程更加方便,因为在调试过程中,如果调用堆栈中的每个项目都有自己的名称来描述,那么调试过程就太酷和不同了。

ps中函数声明和函数表达式的区别

js中的函数声明是指下面的表单:


函数的函数名(){
}




这样,函数就被声明,函数表达式类似于声明函数的表达式,例如:




VAR函数名=函数(){()
}




许多朋友看到这21种文字时可能会产生怀疑。这两种文字相似。它们在应用中似乎是可行的。那么它们之间有什么区别呢

事实上,JS解析器不把函数声明以同样的方式的函数表达式,函数声明,JS解析器将优先确保声明看,之前所有的代码执行了解析,和功能表达,在其他变量的基本类型定义的,一个字也将对其进行分析只有在实现,因此在实践中,他们还是有区别的,具体表现在,当使用函数声明的形式来定义函数,可以写在函数调用语句声明之前,后者是错误的。