我不确定为什么我无法访问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
答案 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
变量标记引用该名称的最近的外部范围变量,这就是您想要的。