javascript – JSHint不会让我在’for’循环中使用’forEach’

我有一个数组作为值的对象.
people = {
    'steve':['foo','bar'],'joe':['baz','boo']
}

对于每个键,我想循环相应数组中的值.足够简单:

for ( var person in people ) {
    person.forEach( function(item) {
      console.log(item)
    })
}

但JSHint抱怨说:

Don't make functions within a loop.

这是我的代码真的有问题吗?我很喜欢短的ES5 for循环语法.我需要使用ES3风格或以其他方式更改代码吗?

解决方法

那里有两个问题,即JSHint警告你的问题,还有一个更为根本的问题.

JSHint警告你的是在理论上,每次循环运行时,都会创建一个新的功能.这会更好:

for ( var person in people ) {
    person.forEach(handlePerson);
}
function handlePerson(item) {
  console.log(item)
}

我在理论上说“因为虽然规范要求每次都创建一个新的函数对象,但这并不意味着引擎不能重用函数的底层实现,并不意味着引擎不能重用如果您没有为其分配任何其他属性或保留对其的引用,那么该函数对象也是一样的. I asked the V8 guys about it(V8是Chrome中的JavaScript引擎),他们表示Chrome将“…在大多数情况下…”重新使用源代码中同一点创建的不同功能对象的底层函数实现,他们会“期望”大多数其他引擎都会这样做.

所以JSHint可能在这种特殊情况下有点过高.但是,这通常是一个有用的警告,特别是如果您在循环中创建的函数是指在循环中内容变化的变量,这是人们经常关闭错误.

但更基本的是,人是一个String(它是人的一个属性名称),而String不具有forEach.你自找的:

for ( var person in people ) {
    people[person].forEach(handlePerson);
}
function handlePerson(item) {
  console.log(item)
}

…例如,人[人]获取该键的数组.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...