这两个特定的javascript函数有什么区别?

What is the difference between these two particular JavaScript functions?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
The difference between the two functions? (“function x” vs “var x = function”)
JavaScript: var functionName = function() {} vs function functionName() {}

1
2
3
4
5
6
7
8
9
10
11
12
13
var test = function() {
    var a = 20;
    var b = 30;

    return a + b;
};

function Add() {
    var a = 20;
    var b = 30;

    return a + b;
}

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


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

法律:

1
2
3
4
5
function a() {
    function b() {

    }
}

非法:

1
2
3
4
5
6
7
function a() {
    if (c) {
        function b() {

        }
    }
}

但您可以这样做:

1
2
3
4
5
6
7
8
function a() {
    var b;
    if (c) {
        b = function() {

        };
    }
}

对于我们中的语言书呆子,您需要参考本规范第12.1、13.1和14节。您将找到以下语法描述。

12.1块

句法

块:
 ;statementlistopt

声明列表:
&对账单
&StatementList语句

13功能定义

句法

函数声明:
&功能标识符(FormalParameterListOpt)功能主体

函数表达式:
&功能标识符opt(formalparameterlistopt)功能主体

格式参数列表:
&标识符
&格式参数列表,标识符

函数体:
&源元素

14程序

句法

程序:
&sourceElementsopt

源元素:
&sourceElement
&源元素源元素

源元素:
&对账单
&功能声明


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

1
2
3
4
test(); // Undefined
var test = function() {
    ...
};

但是,可以在任何时候调用它,并在运行时定义它。

1
2
3
4
test(); // OK
function test() {
    ...
};


您要分配的第一个函数是变量测试变量的匿名函数。然后变量测试成为test()函数。


var意味着您要为匿名函数分配一个变量。如果要将函数赋给变量,可以这样做:

1
2
3
4
5
6
var test = function Add() {
    var a = 20;
    var b = 30;

    return a + b;
};

您必须命名正在使用的函数。

您不必将函数赋给变量,但是如果您想保留函数中的数据,那么应该将函数赋给变量,这样您就可以使用上面的代码。


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

另请参见var functionname=function()vs function functionname()。


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

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

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

  • 等于

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

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