为什么JavaScript中if语句内无法重新赋值外层定义的变量?
问题根因说明
你遇到的不是作用域相关问题,核心错误是对for...in遍历的返回值理解有误:
for...in遍历字符串、数组这类可迭代对象时,返回的是元素的索引(字符串格式),不是元素本身。
你原代码中的遍历逻辑:
for (let char in str) { if (char === "-") { isDash = true } }
比如传入测试值"why-false",遍历得到的char依次是"0"、"1"、"2"、"3"……这类下标值,永远不可能等于"-",所以isDash = true的赋值逻辑永远不会触发,变量自然一直保持初始值false,和作用域没有任何关系。
你写的数组测试代码可以正常运行,是因为你在遍历中没有直接把索引i当值使用,而是用x[i]通过索引取到了数组的实际元素,逻辑才符合预期,这就是两段代码的核心差异。
修复方案
你可以选任意一种方式修改判断逻辑:
- 把
for...in替换为for...of,直接拿到字符串的单个字符:
for (let char of str) { if (char === "-") { isDash = true } }
- 保留
for...in的写法,通过索引取对应的字符判断:
for (let char in str) { if (str[char] === "-") { isDash = true } }
- 更简化的写法,直接用字符串内置方法判断,无需手动遍历:
const isDash = str.includes('-')
你提到的箭头函数可以正常运行,大概率是你写箭头函数的时候实际用了上述正确的取值逻辑,你贴出的箭头函数代码不完整,如果和原代码遍历逻辑完全一致也会出现同样的问题。
内容的提问来源于stack exchange,提问作者Armand Felix
相关产品推荐
相关产品推荐

