为什么forEach遍历对象数组时内部条件判断不触发,移入forEach就生效
核心原因
你写在objDef对象内部的三元判断逻辑只会在代码初始化阶段执行1次,不会在每次调用forEach时重新计算。
- 声明
objDef对象时,responseFlag的初始值为false,因此UIhtml属性会被直接赋值为固定字符串templateFalse的内容,本质是静态值,不是可重复执行的判断逻辑。 - 后续点击按钮修改
responseFlag为true时,仅会修改responseFlag变量本身,不会自动触发objDef.objDefs里UIhtml属性的重新赋值,因此遍历读取的key.UIhtml永远是初始化阶段计算好的旧值,看起来就像判断逻辑没有执行。
为什么判断写在forEach里可以生效
把三元判断移入forEach的回调函数后,每次调用outputResult执行遍历时,都会读取当前最新的responseFlag值做计算,自然可以拿到符合预期的结果。
可选优化方案
如果希望把判断逻辑封装在对象定义内部,可以将UIhtml改为返回计算结果的函数,调用时执行即可实现动态取值:
// 修改objDef定义 objDef = { "objDefs" : [ { // 改为函数,每次调用时重新计算 "UIhtml": () => responseFlag ? templateTrue : templateFalse } ] }; // 调用时执行函数 UI_exc = { outputResult: function() { objDef.objDefs.forEach(function(item){ targetRender.innerHTML = item.UIhtml() console.log(responseFlag) }); } };
内容的提问来源于stack exchange,提问作者estebanlobo
相关产品推荐
相关产品推荐

