所有JavaScript函数类型?

时间:2014-07-09 06:00:25

标签: javascript function anonymous-function function-declaration

在为我的小型代码库创建多个测试项目的同时,我遇到了许多以不同方式创建函数的教程。

例如:

  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.
  5. 尽管如此,我想澄清一下我对每种功能类型的几个问题。

    函数声明:

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

    函数表达式是否可以覆盖函数表达式,因为this问题似乎表明并且这个源代码似乎备份了?:

    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(){
        //...
    };
    

    不同:?

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

    第一个name()是函数表达式,第二个name()是函数声明吗?或者是第一个name()函数表达式,第二个name()是一个带有可选 left-out 分号的函数表达式。因为我在函数表达式中读过它,所以只建议使用分号。 令我困惑的是,在函数声明中,您必须具有标识符和正文。在表达式中,标识符是可选的,但您必须具有正文。所以,如果你有

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

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

    匿名自执行功能:

    我理解这些是如何工作的,但我已经看到了两种写作方式,一种我几乎肯定是错的。我只想澄清一下:

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

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

    我已经读过匿名函数执行的原因是因为它包含在()中,并且如果要将任何参数传递给它,则必须在()之后和之前添加它们。如果这是真的,那么整个关闭的分号......第二个匿名函数写得不正确......这是真的吗?

    我已阅读了几个已使用此link回答的问题以及包含此信息的内容

3 个答案:

答案 0 :(得分:1)

您在此处确定的前两种功能只有"真实"。另外两个是函数表达式的应用。

按顺序完成您的问题:

  

是否可以通过函数表达式覆盖函数声明(在解析时计算并且在括号后不需要括号),因为这个问题似乎表明并且此源代码似乎已备份?

是。 (不幸的是。)第二次声明一个函数会覆盖第一个定义。但是,如果已经为变量分配了对它的引用,则原始函数仍然可以访问;例如:

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())之间进行比较;没有真正的区别。

答案 1 :(得分:0)

我想你应该知道:

// 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
() => {}

答案 2 :(得分:0)

以下有用的链接提供了有关所有类型的JavaScript函数的一些详细信息和示例:

函数声明,函数表达式,带有 分组运算符,命名函数表达式,立即调用 函数表达式(IIFE),函数构造函数,对象构造函数, ES6箭头功能,闭包,闭包和作用域...

JavaScript Scope Context and ‘this’ under the hood

Different ways of defining functions in JavaScript (this is madness!)

Different ways of defining a function in JavaScript

JavaScript Function

6 Ways to Declare JavaScript Functions

Functions - Browser compatibility

How do JavaScript closures work?

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