第一种称为命名函数,第二种称为匿名函数.
关键的实际区别在于何时可以使用sum函数.例如:-
var z = sum(2, 3); function sum(x, y) { return x+y; }
z
分配5而这个: -
var z = sum(2, 3); var sum = function(x, y) { return x+y; }
将失败,因为在第一行执行变量sum时尚未分配该函数.
在执行开始之前,对已命名的函数进行解析并将其分配给它们的名称,这就是为什么命名函数可以在其定义之前的代码中进行转换的原因.
通过代码分配函数的变量显然只能在执行超过赋值后用作函数.
第一种称为命名函数,第二种称为匿名函数.
关键的实际区别在于何时可以使用sum函数.例如:-
var z = sum(2, 3); function sum(x, y) { return x+y; }
z
分配5而这个: -
var z = sum(2, 3); var sum = function(x, y) { return x+y; }
将失败,因为在第一行执行变量sum时尚未分配该函数.
在执行开始之前,对已命名的函数进行解析并将其分配给它们的名称,这就是为什么命名函数可以在其定义之前的代码中进行转换的原因.
通过代码分配函数的变量显然只能在执行超过赋值后用作函数.
第一种趋向于使用有几个原因:
名称"sum"显示在stacktrace中,这使得在许多浏览器中调试变得更容易.
名称"sum"可以在函数体内使用,这使得它更容易用于递归函数.
函数声明在javascript中被"提升",因此在第一种情况下,函数保证只被定义一次.
分号插入导致
var f = function (x) { return 4; } (f)
分配4到f
.
不过要记住一些注意事项.不要做
var sum = function sum(x, y) { ... };
在IE 6上,因为它将导致创建两个函数对象.如果你这样做会特别困惑
var sum = function mySym(x, y) { ... };
根据标准,函数sum(x,y){...}不能出现在if块或循环体内,因此不同的解释器会对待
if (0) { function foo() { return 1; } } else { function foo() { return 2; } } return foo();
不同.在这种情况下,你应该这样做
var foo; if (0) { foo = function () { return 1; } } ...
第一个是命名函数语句,第二个是将匿名函数表达式赋给变量.
函数语句会立即添加到其作用域中 - 您无需在调用它之前运行它,因此这有效:
var y = sum(1, 2); function sum(x, y) { return x + y; }
但是函数表达式仅在执行代码时分配给变量,因此这不起作用:
// Error here because the function hasn't been assigned to sum yet. var y = sum(1, 2); var sum = function(x, y) { return x + y; }
表达式表单的一个优点是您可以使用它在不同的点为表达式分配不同的函数 - 因此您可以更改函数,或在不同条件下使用不同的函数(例如,取决于所使用的浏览器).
命名函数语句的一个优点是调试器将能够显示名称.虽然,您可以命名函数表达式:
var sum = function sum(x, y) { return x + y; }
但这可能令人困惑,因为这两个名称实际上在不同的范围内并且指的是不同的东西.