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

时间:2012-04-03 22:57:09

标签: javascript

  

可能重复:
  The difference between the two functions? (“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究竟做了什么?

6 个答案:

答案 0 :(得分: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功能定义

语法

功能声明:
功能标识符 FormalParameterList opt ){功能体}

FunctionExpression:
功能标识符 opt FormalParameterList opt ){功能体}

FormalParameterList:
标识符
FormalParameterList 标识符

功能体:
SourceElements

14计划

语法

计划:
SourceElements opt

SourceElements:
SourceElement
SourceElements SourceElement

SourceElement:
声明
功能声明

答案 1 :(得分:1)

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

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

然而,这可以在任何时间调用并在运行时定义。

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

答案 2 :(得分:0)

不同之处在于,在第一种情况下,您具有分配给名称的匿名函数,在第二种情况下,您具有函数声明。在大多数情况下,这种差异并不重要。重要的是

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

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

  4. 相当于

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

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

答案 3 :(得分:0)

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

另见var functionName = function() {} vs function functionName() {}

答案 4 :(得分:0)

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

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

    return a + b;
};

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

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

答案 5 :(得分:0)

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