JavaScript中恒为true的if语句不执行问题排查求助
问题根因:JavaScript 块级作用域规则
你遇到的问题是let关键字的块级作用域特性导致的:
- 用
let声明的变量,仅在包裹它的最近一对大括号{}形成的作用域内可访问,出了这个作用域就无法读取。
两段代码的差异解析
可正常运行的代码
cell变量是在forEach回调函数的顶级作用域声明的,后续调用cell.text(val)和它在同一个作用域,可正常访问到变量:
Object.values(dataRow).forEach((val) => { let cell = row.append('td'); cell.text(val); })
报错的代码
let cell写在if(true)的大括号内部,仅在if块内有效,出了if块后cell变量已经被销毁,你在块外调用cell.text(val)会直接抛出未定义变量的引用错误,导致代码终止运行:
Object.values(dataRow).forEach((val) => { if (true) { let cell = row.append('td'); // cell仅在这个if块内可用 } cell.text(val); // 这里访问不到cell,直接报错 })
修正方案
你可以根据自己的业务逻辑选择两种写法:
- 把cell变量声明提升到if块外部:
Object.values(dataRow).forEach((val) => { let cell; // 提升到和text赋值同作用域声明 if (true) { cell = row.append('td'); } cell.text(val); })
- 把内容赋值逻辑也放到if块内部(更推荐,符合条件判断的语义):
Object.values(dataRow).forEach((val) => { if (true) { let cell = row.append('td'); cell.text(val); } })
如果后续要实现指定列应用格式的需求,记得用forEach的第二个参数获取列索引即可,示例:
// 示例:仅给第3列(索引从0开始)加特殊格式 Object.values(dataRow).forEach((val, index) => { let cell = row.append('td'); cell.text(val); if (index === 2) { cell.class('special-col'); } })
内容的提问来源于stack exchange,提问作者Fritz Knack
相关产品推荐
相关产品推荐

