Javascript 在循环中使用Array.prototype.forEach可以吗?
JSHint在抱怨我,因为我使用Javascript 在循环中使用Array.prototype.forEach可以吗?,javascript,foreach,jshint,Javascript,Foreach,Jshint,JSHint在抱怨我,因为我使用for(oin…)在对象上循环,然后使用o.somearray.forEach(function(){…})内部。它说的是不要在循环中创建函数,但在这种情况下,这有关系吗?它看起来更好一些,因为线条更少,看起来(稍微)更好,但是它有什么重要的意义吗 使用普通for循环并像那样迭代数组更好吗,或者创建一个函数并使用ECMA5版本更好吗 我在做这样的事情: for(var i in data) { data[i].arr.forEach(function(...
for(oin…
)在对象上循环,然后使用o.somearray.forEach(function(){…})代码>内部。它说的是不要在循环中创建函数,但在这种情况下,这有关系吗?它看起来更好一些,因为线条更少,看起来(稍微)更好,但是它有什么重要的意义吗
使用普通for循环并像那样迭代数组更好吗,或者创建一个函数并使用ECMA5版本更好吗
我在做这样的事情:
for(var i in data) {
data[i].arr.forEach(function(...) {
// do magic
});
}
可以使用forEach
,这里的建议是传递给forEach
的函数应该在循环之外创建,如下所示:
var doMagic = function(...) {
// do magic
};
for (var i in data) {
data[i].arr.forEach(doMagic);
}
不鼓励在循环中创建函数,因为这样效率很低,JavaScript解释器将在每次循环迭代中创建函数的实例。更多详细信息请参见。使用forEach
是可以的,这里建议您传递给forEach
的函数应该在循环之外创建,如下所示:
var doMagic = function(...) {
// do magic
};
for (var i in data) {
data[i].arr.forEach(doMagic);
}
不鼓励在循环中创建函数,因为这样效率很低,JavaScript解释器将在每次循环迭代中创建函数的实例。中提供了其他详细信息。是的,可以嵌套构造。也可以在每个循环中创建一个“新”函数。以及
在同一执行上下文中创建多个“新”函数时的性能差异是一个实现细节;但它本身并不慢。(参见本1)
即使在“新”情况下会创建一个新的函数对象,每个循环也会创建相同数量的执行上下文,即当前执行上下文和调用函数的时间。更智能的JavaScript实现可以轻松地利用这一点;或者他们可能不会
在这种特殊情况下,我更喜欢内联方法
1当然,测试特定的JavaScript实现
- 在IE 10中,Chrome 33和FF 23表现出同等的性能
- FF 27支持“新”功能案例
- Safari 5在“新”的情况下会对数字进行错误处理并运行较慢
是的,可以嵌套构造。也可以在每个循环中创建一个“新”函数。以及
在同一执行上下文中创建多个“新”函数时的性能差异是一个实现细节;但它本身并不慢。(参见本1)
即使在“新”情况下会创建一个新的函数对象,每个循环也会创建相同数量的执行上下文,即当前执行上下文和调用函数的时间。更智能的JavaScript实现可以轻松地利用这一点;或者他们可能不会
在这种特殊情况下,我更喜欢内联方法
1当然,测试特定的JavaScript实现
- 在IE 10中,Chrome 33和FF 23表现出同等的性能
- FF 27支持“新”功能案例
- Safari 5在“新”的情况下会对数字进行错误处理并运行较慢
你能展示这段代码吗?你能展示这段代码吗?你能为“低效”提供一个基准吗?虽然它必须是一个新的函数对象,但如果它没有得到很好的优化,我会感到惊讶;例如,整个函数体可以共享,它不会创建更多的执行上下文。此外,不确定您的版本有什么不同。它比我的版本做得更多。正如这个问题所示,我的版本只在相同的执行上下文中创建“新”函数。我认为测试的其他版本也有相同的执行上下文,我认为这可能归结于浏览器的智能程度,以及命名函数和未命名函数之间的差异。它们不能/不具有相同的执行上下文。因为具有新执行上下文的新函数会创建“新”函数。这将更慢(虽然可能不会太慢),因为在这种情况下,必须创建新的执行上下文。(尽管与第一个链接相比,这个论点不那么有力。)你能为“低效”提供一个基准吗?虽然它必须是一个新的函数对象,但如果它没有得到很好的优化,我会感到惊讶;例如,整个函数体可以共享,它不会创建更多的执行上下文。此外,不确定您的版本有什么不同。它比我的版本做得更多。正如这个问题所示,我的版本只在相同的执行上下文中创建“新”函数。我认为测试的其他版本也有相同的执行上下文,我认为这可能归结于浏览器的智能程度,以及命名函数和未命名函数之间的差异。它们不能/不具有相同的执行上下文。因为具有新执行上下文的新函数会创建“新”函数。这将更慢(虽然可能不会太慢),因为在这种情况下,必须创建新的执行上下文。(尽管与第一个链接相比,这个论点不那么有力。)