var name=function(){}和&;Javascript中的函数名(){}?
可能重复:var name=function(){}和&;Javascript中的函数名(){}?,javascript,Javascript,可能重复: 假设我们在一个函数中,而不是在全局名称空间中 function someGlobalFunction() { var utilFunction1 = function() { } function utilFunction2 () { } utilFunction1(); utilFunction2(); } 这些是同义词吗?当someGlobalFunction返回时,这些函数是否完全不存在?出于可读性或其他原因,我应该选择其中一种还是另一种?它们
假设我们在一个函数中,而不是在全局名称空间中
function someGlobalFunction() {
var utilFunction1 = function() {
}
function utilFunction2 () {
}
utilFunction1();
utilFunction2();
}
这些是同义词吗?当someGlobalFunction
返回时,这些函数是否完全不存在?出于可读性或其他原因,我应该选择其中一种还是另一种?它们基本相同
utilFunction1
仅在声明后可用utilFunction2
被提升到函数顶部,因此可以在定义之前使用
function someGlobalFunction() {
utilFunction1(); // Error: untilFunction1 is undefined :(
utilFunction2(); // Works
var utilFunction1 = function() {
}
function utilFunction2 () {
}
}
除非它们被困在一个闭包中,否则当someGlobalFunction
返回时,它们都将不再存在
我更喜欢使用用于声明utilFunction2
的方法,但这取决于您
形式为utilFunction2
(称为函数声明)的声明有被命名的好处(即在您喜爱的debuggerTM中显示为utilFunction2
),其中asutilFunction1
(称为函数表达式)将作为匿名函数显示
为了完整性,您还需要表单
var utilFunction3 = function utilFunction4() {
// blah
};
。。。它被称为命名函数表达式,它有自己的(和(在旧版本的IE中)) 是的,它们完全不同:
- utilFunction1没有名称,因此如果它引发异常,调试工具只会告诉您引发了匿名函数
- utilFunction2甚至在到达该行之前就可以在功能范围内使用(如fletcher所述)
- 在IE中的某些情况下,使用utilFunction2表示法可能会导致异常行为
IE将函数范围问题发挥到极致,有效地评估函数,即使没有代码路径 祝贺你!您已经找到了涉及到功能提升的情况
var foo = function() { };
这与
function foo() { };
因为其他地方提到的所有原因,加上一个
第二个示例是“提升”-它将在当前关闭范围内的任何位置可用(通常是当前功能)。甚至在宣布关闭之前
类似这样的方法会奏效:
function foo() {
bar();
function bar() { alert('baz'); }
}
而像这样的事情肯定不会:
function foo() {
bar();
var bar = function bar() { alert('baz'); };
}
在第二个示例中,您会得到一个错误,因为尚未定义bar。如果您交换函数foo中的两行,该示例将起作用
Douglas Crockford提倡使用第二种方法,因为它不包含像提升这样的隐藏行为-您的代码完全按照它所说的做,没有技巧。+1-看起来您已经涵盖了所有内容。还可以注意到,第一个是FunctionExpression,而后一个是FunctionDeclaration。如果或其他非函数块在ECMAScript中无效,则将function语句放在
中;浏览器行为千差万别。避开!
function foo() {
bar();
var bar = function bar() { alert('baz'); };
}