以这些方式声明函数之间是否存在主要区别:
function foo(){ alert('BAR'); }
var foo = function (){ alert('BAR'); }
var foo = function bar(){ alert('BAR'); }
我在这里被告知:
它发生在不同的时间,并导致一个引用匿名函数的变量。函数声明发生在范围内执行任何逐步代码之前,并导致绑定和具有正确名称的函数。
我声明我的函数的方式真的会影响我的代码的效率吗?如果是的话,哪种方式最好使用?
以这些方式声明函数之间是否存在主要区别:
function foo(){
alert('BAR');
}
var foo = function (){
alert('BAR');
}
var foo = function bar(){
alert('BAR');
}
我在这里被告知:
它发生在不同的时间,并导致一个引用匿名函数的变量。函数声明发生在范围内执行任何逐步代码之前,并导致绑定和具有正确名称的函数。
我声明我的函数的方式真的会影响我的代码的效率吗?如果是的话,哪种方式最好使用?
是的,有一个主要区别。
第一个是函数声明。它发生在进入执行上下文时,在处理任何分步代码之前。它不能在任何类型的控制块中(例如,它在if
语句的主体中是不合法的;但是,如果您这样做,大多数浏览器会尝试适应它——有时会导致非常令人惊讶的行为 ——与规范不一致)。它产生一个命名函数。
第二个是函数表达式(特别是匿名函数表达式)。像所有表达式一样,它在代码的逐步执行中遇到它时会被处理。和所有表达式一样,它可以在控制块内。它导致一个没有名称的函数分配给一个有名称的变量。
第三个是命名函数表达式。这是一个像上面一样的函数表达式,但函数也被赋予了一个名称。你想在IE8 和更早版本中避免这些,因为 IE 实际上会出错,创建两个单独的函数(在两个不同的时间)。(基本上,IE 将其视为函数声明和函数表达式。)IE9 终于做到了这一点。
请注意,您的第二个和第三个示例依赖于自动分号插入;因为它们都是赋值语句,所以它们应该以 a;
结尾}
(在函数结束之后)。