3

可能重复:
这两个功能之间的区别?(“function x” vs “var x = function”)
JavaScript: var functionName = function() {} vs function functionName() {}

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做什么的?

4

6 回答 6

3

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

合法的:

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 块

句法

块:
    { StatementList opt }

StatementList :
    声明
    StatementList 声明

13 功能定义

句法

FunctionDeclaration:
    函数标识符 FormalParameterList opt ){ FunctionBody }

FunctionExpression :
    函数标识符opt ( FormalParameterList opt ) { FunctionBody }

FormalParameterList :
    标识符
    FormalParameterList ,标识符

功能体:
    源元素

14 程序

句法

程序:
    SourceElements opt

源元素:
    源
    元素源元素源元素

SourceElement :
    声明
    函数声明

于 2012-04-03T23:05:05.060 回答
1

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

test(); // Undefined
var test = function() {
    ...
};

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

test(); // OK
function test() {
    ...
};
于 2012-04-03T23:12:38.567 回答
0

不同之处在于,在第一种情况下,您有一个匿名函数,而在第二种情况下,您有一个函数声明。在大多数情况下,这种差异并不重要。重要的地方是

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

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

相当于

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

(你可以看到它为什么会失败。)

于 2012-04-03T23:04:40.893 回答
0

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

另请参阅var functionName = function() {} vs function functionName() {}

于 2012-04-03T23:10:20.173 回答
0

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

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

    return a + b;
};

您必须命名您正在使用的功能。

您不必将函数分配给变量,但如果您想保留函数中的数据,那么您应该将函数分配给变量,因此您将使用上面的代码。

于 2012-04-03T23:12:13.153 回答
0

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

于 2012-04-03T23:13:12.197 回答