这一切都取决于您声明函数的位置的偏好;吊装。
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”被提升,但主体被保留,以在执行期间分配。
您可以使用类似于函数声明的语法为函数表达式中定义的函数命名。这不会使其成为函数声明,并且名称不会进入作用域,主体也不会被提升。
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"
因此,如果您希望将函数提升到顶部,请使用function declaration
否则使用expression
。我更喜欢后者,因为我通常使用以下方法构建对象文字function expressions
.
Named function expressions
当抛出错误时可以很方便。控制台会告诉您该功能是什么,而不是说明anonymous
aka 堆栈跟踪.