这两个特定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
到底做了什么?区别在于,在第一种情况下,为名称分配了匿名函数,在第二种情况下,为函数声明分配了匿名函数。在大多数情况下,这种差异并不重要。重要的是
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){函数体} 函数表达式:
函数Identifieropt(FormalParameterListopt){函数体 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() {
...
};