Possible Duplicate:
JavaScript: var functionName = function() {} vs function functionName() {}
在 Javascript 中提取函数有两种可能的方法:
var foo = function() { ... }
这有点做作;另一种常见的模式是:
var foo = {
baz: 43,
doSomething: function() {
// ...
}
}
对比
function foo() {
// ...
}
是否有明确的理由选择其中之一?
这一切都取决于您对函数声明位置的偏好;吊装。
函数声明和变量声明总是被 JavaScript 解释器无形地移动(“提升”)到它们包含范围的顶部。显然,函数参数和语言定义的名称已经存在。这意味着像这样的代码:
function foo() {
bar();
var x = 1;
}
其实是这样解释的:
function foo() {
var x;
bar();
x = 1;
}
请注意声明的赋值部分没有提升。只挂了名字。函数声明不是这种情况,整个函数体也会被提升。
function test() {
foo(); // TypeError "foo is not a function"
bar(); // "this will run!"
var foo = function () { // function expression assigned to local variable 'foo'
alert("this won't run!");
}
function bar() { // function declaration, given the name 'bar'
alert("this will run!");
}
}
test();
在这种情况下,只有函数声明将其主体提升到顶部。名称“foo”被提升,但 body 被留下,在执行期间分配。
您可以为函数表达式中定义的函数命名,语法类似于函数声明。这不会使其成为函数声明,名称不会进入范围,主体也不会提升。
foo(); // TypeError "foo is not a function"
bar(); // valid
baz(); // TypeError "baz is not a function"
bin(); // ReferenceError "bin is not defined"
var foo = function () {}; // anonymous function expression ('foo' gets hoisted)
function bar() {}; // function declaration ('bar' and the function body get hoisted)
var baz = function bin() {}; // named function expression (only 'baz' gets hoisted)
foo(); // valid
bar(); // valid
baz(); // valid
bin(); // ReferenceError "bin is not defined"
因此,如果您希望将函数提升到顶部,请使用函数声明
,否则使用表达式
。我更喜欢后者,因为我通常使用 函数表达式
的方法构建对象文字。
命名函数表达式
在抛出错误时可以派上用场。控制台将告诉您函数是什么,而不是声明anonymous
又名堆栈跟踪。