这两个特定JavaScript函数之间的区别是什么?

这两个特定JavaScript函数之间的区别是什么?,javascript,Javascript,可能重复: 这两种功能之间有什么区别?如果我调用add()或test(),它们都会给出相同的结果。var到底做了什么?区别在于,在第一种情况下,为名称分配了匿名函数,在第二种情况下,为函数声明分配了匿名函数。在大多数情况下,这种差异并不重要。重要的是 在调试器中,有时可以更容易地在堆栈跟踪和 变量提升导致整个函数声明“移动”到其包含函数的顶部,因此 foo(1,2); var foo=函数(a,b){ 返回a+b; } 相当于 var foo; foo(1, 2); foo = functi

可能重复:


这两种功能之间有什么区别?如果我调用add()或test(),它们都会给出相同的结果。
var
到底做了什么?

区别在于,在第一种情况下,为名称分配了匿名函数,在第二种情况下,为函数声明分配了匿名函数。在大多数情况下,这种差异并不重要。重要的是

  • 在调试器中,有时可以更容易地在堆栈跟踪和
  • 变量提升导致整个函数声明“移动”到其包含函数的顶部,因此

    foo(1,2); var foo=函数(a,b){ 返回a+b; }

  • 相当于

    var foo;
    foo(1, 2);
    foo = function (a, b) {
        return a+b;
    }
    

    (您可以看到它失败的原因。)

    函数声明语法不能在block语句中使用

    法律:

    function a() {
        function b() {
    
        }
    }
    
    非法:

    function a() {
        if (c) {
            function b() {
    
            }
        }
    }
    
    但您可以这样做:

    function a() {
        var b;
        if (c) {
            b = function() {
    
            };
        }
    }
    
    对于我们当中的语言呆子,您需要参考规范的第12.1、13.1和14节。您将发现以下语法描述

    12.1块

    语法

    块:
    {语句列表选项}

    语句列表:
    声明
    语句列表语句

    13功能定义

    语法

    函数声明:
    函数标识符FormalParameterListopt){函数体}

    函数表达式:
    函数IdentifieroptFormalParameterListopt){函数体

    FormalParameterList:
    标识符
    FormalParameterList标识符

    函数体:
    源元素

    14个节目

    语法

    节目:
    SourceElementsopt

    SourceElements:
    SourceElement
    源元素源元素

    SourceElement:
    声明
    FunctionDeclaration

    您可以在其定义之前调用Add(),但不能在其定义之前调用test()


    另请参见。

    var表示将变量分配给匿名函数。如果要将函数分配给变量,可以执行以下操作:

    var test = function Add() {
        var a = 20;
        var b = 30;
    
        return a + b;
    };
    
    您必须命名您正在使用的函数

    您不必将函数分配给变量,但如果希望保留函数中的数据,则应将函数分配给变量,以便使用上述代码。

    它们不同。 如果在声明之前调用使用var声明的函数,它将抛出一个错误,因为它尚未声明

    test(); // Undefined
    var test = function() {
        ...
    };
    
    但是,这可以在任何时候调用,也可以在运行时定义

    test(); // OK
    function test() {
        ...
    };
    

    您分配的第一个函数是一个匿名函数,用于变量测试变量。然后,变量测试变成Test-()函数。

    可能的DUP @ KendallFrey:不要在一个可能的DUPE消息中进行编辑。如果你在这篇文章中投票失败,因为它是一个DUPE,考虑它不是最初发布在StAdvExcel中,因此O.P.不会像你所想的那样容易地搜索DUPES。这在ECMA-262规范中是否被明确宣布为非法,如果是,在哪里?@kojiro-是的,当然让我包括这一点。@kojiro-采取了标记和html的合理组合,但我已经包括了懒惰的语法。:)
    test(); // OK
    function test() {
        ...
    };