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(),它们都会给出相同的结果。
不能在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()函数。
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; } |
(你可以看到失败的原因。)