为什么我不能在javascript中访问forEach()里面的数组

时间:2017-11-13 16:33:09

标签: javascript arrays foreach

我不确定为什么我无法访问allSubIABs内的forEach数组。 我可以正常访问字符串newCheckState

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)
})

输出:

object []
asdasdasd
undefined undefined
Uncaught TypeError: Cannot read property 'concat' of undefined

2 个答案:

答案 0 :(得分:3)

您的问题是回调中的let声明隐藏了外部allSubIABs声明。摆脱let

答案 1 :(得分:1)

您的let allSubIABs声明声明了一个新变量,其默认值为undefined,并且此新变量会影响对具有相同名称的外部allSubIABs的访问。

您可以看到吊装如何影响您的功能。此代码等同于您自己的代码:

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

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

如您所见,变量声明首先发生(这就是“提升”的含义),新声明的变量保持值undefined,直到赋值。

类似地考虑产生错误var a = a.foo;的{​​{1}},因为Cannot read property 'foo' of undefined确实作为变量存在,但它从未被赋予过值。

由于您确实想要访问外部a变量,因此请勿使用allSubIABs声明新变量。这将导致let变量标记引用该名称的最近的外部范围变量,这就是您想要的。