所有JavaScript函数类型

All JavaScript Function Types?

本文关键字:类型 函数 JavaScript 所有      更新时间:2023-09-26

在为我的小代码库编写几个测试项目时,我遇到了许多关于以多种不同方式编写函数的教程。

例如:

  1. 函数声明
    • FunctionDeclaration : function Identifier ( FormalParameterList opt ){ FunctionBody }
  2. 函数表达式
    • FunctionExpression : function Identifier opt ( FormalParameterList opt ){ FunctionBody }
  3. 匿名自执行函数

    • (function(msg){ alert(msg); })('SO'); // alerts "SO"
  4. 匿名自执行函数,我在源代码中看到,我怀疑可能是不正确的,但我想确保

    • (function(msg){ alert(msg); }('SO')); // alerts "SO", but the passed parameter appears inside the parenthesis that wrap the function, not after like I think is correct.

说了这么多,我想澄清关于每种类型的函数的几个问题。

函数声明:

function display(){
    //this function is evaluated at parse time,
      can be called any time
}

函数声明(在解析时评估,不需要括号后的括号)可以被覆盖函数表达式,因为这个问题似乎表明,这个源代码似乎备份?:

var display = function(){
                 //this function will be called as opposed to the
                 //display() declaration (above) any time 
                 //display() is used after this variable assignment
              };

函数表达式:

var display = function nameOptional(){
              };

在赋值给变量的函数表达式中括号后的分号是必要的吗?还有,这是否意味着这个:

function name(){
    //...
};

不同于this:?

function name(){
    //...
}//no semi-colon

第一个name()是函数表达式,第二个name()是函数声明吗?还是第一个name()是函数表达式,第二个name()是带有可选的省略的分号的函数表达式?因为我在函数表达式中读到过,分号只被推荐使用。让我感到困惑的是,在函数声明中必须有标识符和函数体。在表达式中,标识符是可选的,但必须有一个主体。所以如果你有

function identifier(){
    //...body...
}

是声明还是表达式,因为表达式或声明中不需要分号。对于表达式,仅建议在变量赋值的情况下获得最佳结果。

匿名自执行函数:

我明白这是怎么回事,但我看到了两种写法,其中一种我几乎可以肯定是错误的。我只是想澄清一下:

(function(msg){
    alert(msg);
})("SO");

(function(msg){
    alert(msg);
}("SO"));

我读到一个匿名函数执行的原因是因为它被包装在()中,如果你想要任何参数传递给它,它们必须在那些()之后和分号之前添加,如果这是真的…第二个匿名函数写错了…这是真的吗?

我已经阅读了几个问题,这些问题已经通过这个链接和包含此信息的内容得到了回答

只有您在这里确定的前两种类型的函数是"真实的"。其他两个是函数表达式的应用。

按顺序浏览你的问题:

是真的,函数声明(在解析时评估,不需要括号后的括号)可以被函数表达式覆盖,因为这个问题似乎表明,这个源代码似乎备份?

是的。(不幸的是)。第二次声明函数会覆盖第一次定义。但是,如果对原始函数的引用被赋值给一个变量,则原始函数仍然可以访问;例如:

function a() { console.log(1); }
var a1 = a;
function a() { console.log(2); }
a1(); // outputs "1"
a();  // outputs "2"

在赋值给变量的函数表达式中括号后的分号是必要的吗?

一般来说,是——它表示语句的结束,就像var a = 1;中的分号一样。有时它是可选的,就像Javascript中的大多数分号一样,但省略它是不可取的。

而且,这是否意味着[带分号的函数声明]与[不带分号的函数声明]不同?

在函数声明的末尾,分号不是必需的,也没有意义。它实际上被解释为声明之间的独立分号,没有任何作用。

我读到一个匿名函数执行的原因是因为它被包装在()中,如果你想要任何参数传递给它,它们必须在那些()之后和分号之前添加,如果这是真的…第二个匿名函数写错了…这是真的吗?

他们都很好;这是一种风格的选择。这一行必须以function以外的东西开始,这样它就不会被解释为函数定义,所以使用了一个初始括号,但是括号的确切位置并不重要。如果我们将整个函数表达式替换为a,则(a)()(a())之间的比较是简单的;没有真正的区别。

我想你应该知道:

// Function
function Function() {}
// Generator Function
function* Function() {}
// Asynchronous Function
async function Funtion() {}
// Asynchronous Generator Function
async function* Function() {}
// Class
class Function {}
class Function extends Object {}
// Arrow Function
() => {}

这里有一些有用的链接,提供了一些关于所有类型的JavaScript函数的细节和示例:

函数声明,函数表达式,函数表达式分组操作符,命名函数表达式,立即调用函数表达式,函数构造函数,对象构造函数,ES6箭头函数,clores, Closure和scope…

JavaScript作用域上下文和' this '在后台

在JavaScript中定义函数的不同方式(这太疯狂了!)

JavaScript中定义函数的不同方式

JavaScript函数

JavaScript函数的6种声明方法

Functions -浏览器兼容性

JavaScript闭包是如何工作的?

这些文章和教程,我发现可以帮助更好地理解JavaScript类型的函数和函数表达式的应用程序。我希望他们能帮助你。