部分取决于您是否使用函数表达式 or a 函数声明。它们是不同的事情,发生的时间不同,对周围范围的影响也不同。那么让我们从区别开始吧。
一个功能表达 is a function
使用结果作为右侧值的生产 - 例如,您将结果分配给变量或属性,或者将其作为参数传递到函数中,等等。这些都是函数表达式:
setTimeout(function() { ... }, 1000);
var f = function() { ... };
var named = function bar() { ... };
(不要使用最后一个——它被称为命名函数表达式- 实现有错误,特别是IE.)
相比之下,这是一个函数声明:
function bar() { ... }
它是独立的,您不使用结果作为右手值。
它们之间的两个主要区别:
函数表达式在程序流程中遇到的地方进行计算。当控制进入包含范围(例如,包含函数或全局范围)时,将对声明进行评估。
函数的名称(如果有)在函数的包含范围中定义宣言。它不是为了一个功能表达(排除浏览器错误)。
你的匿名函数是函数表达式,因此除非解释器进行优化(这是免费的),它们将在每个循环中重新创建。因此,如果您认为实现会优化,那么您的使用就很好,但是将其分解为命名函数还有其他好处,而且重要的是,不会花费您任何费用。另请参阅卡萨布兰卡的回答有关口译员为何不可以的说明able优化在每次迭代时重新创建函数,具体取决于它检查代码的深度。
更大的问题是如果你使用了一个函数宣言在循环中,条件体等:
function foo() {
for (i = 0; i < limit; ++i) {
function bar() { ... } // <== Don't do this
bar();
}
}
从技术上讲,仔细阅读规范的语法表明它是invalid这样做,尽管实际上没有任何实现真正强制执行这一点。实施措施有哪些do情况多种多样,最好远离它。
对于我来说,最好的选择是使用单个函数声明,如下所示:
function foo() {
for (i = 0; i < limit; ++i) {
bar();
}
function bar() {
/* ...do something, possibly using 'i'... */
}
}
你得到相同的结果,实现不可能在每个循环上创建一个新函数,你得到函数有名字的好处,你不会失去任何东西。