No estoy seguro de por qué no puedo acceder a la matriz allSubIABs dentro de forEach. Puedo acceder a la cadena newCheckState bien.

const newIABs = { ...this.state.iabs }
let allSubIABs = []
let newCheckState = 'asdasdasd'

console.log(typeof allSubIABs, allSubIABs)
Object.keys(newIABs).forEach(firstLevelIABCode => {
  console.log(newCheckState)
  console.log(typeof allSubIABs, allSubIABs)
  let allSubIABs = allSubIABs.concat(newIABs[firstLevelIABCode].children)
})

Salida:

object []
asdasdasd
undefined undefined
Uncaught TypeError: Cannot read property 'concat' of undefined
0
Jason Feng 13 nov. 2017 a las 19:33

2 respuestas

La mejor respuesta

Su declaración let allSubIABs declara una nueva variable cuyo valor predeterminado es undefined, y esta nueva variable oculta el acceso al allSubIABs externo con el mismo nombre.

Puede ver cómo la elevación afecta su función. Este código es equivalente al suyo:

Object.keys(newIABs).forEach(firstLevelIABCode => {
  let allSubIABs;

  console.log(newCheckState)
  console.log(typeof allSubIABs, allSubIABs)
  allSubIABs = allSubIABs.concat(newIABs[firstLevelIABCode].children)
})

Como puede ver, las declaraciones de variables ocurren primero (esto es lo que significa "izar") y las variables recién declaradas mantienen el valor undefined hasta que se les asigna un valor.

Considere análogamente var a = a.foo; que produce el error Cannot read property 'foo' of undefined porque a existe como una variable, pero nunca se le ha dado un valor.

Dado que en realidad desea acceder a la variable allSubIABs externa, no declare una nueva variable con let. Esto hará que los tokens de variable allSubIABs se refieran a la variable de alcance externo más cercana de ese nombre, que es lo que desea.

1
apsillers 13 nov. 2017 a las 16:56

Su problema es que la declaración let en la devolución de llamada oculta la declaración allSubIABs externa. Solo deshazte de eso let.

3
Pointy 13 nov. 2017 a las 16:37