JavaScript入门疑问:移除big变量的let后代码正常,原因是什么?
问题原因:let的块级作用域特性
你的代码问题核心在于let声明的变量具有块级作用域,具体来说:
- 你在
if(x>5)块里第一次用let big = y;声明的big,只在这个外层块里有效。 - 后面的
if(y>z)和else if(z>y)块中,又用let big = ...重新声明了新的big变量——这两个big是完全独立的局部变量,只在各自的小if块内存在,和外层的big没有关联。 - 所以当代码走到for循环时,用到的big还是最开始赋值的
y,根本没被后面的判断逻辑更新。如果y小于等于z,这个big的值就不是你预期的最大值,循环次数不符合预期,甚至如果y是0或负数,循环直接不执行,看起来就像代码“无法运行”。
而去掉所有big声明的let后:
- big变成了
if(x>5)块作用域下的变量(不再重新声明新变量),后面的big = y和big = z都是直接修改同一个big的值。 - 这样for循环时用到的big就是经过判断后的正确最大值,自然能按预期执行。
优化建议
其实不用去掉所有let,只需要保留第一次的let big = y;来声明变量,后面的赋值去掉let即可,这样既保持块级作用域(避免污染外部),又能正确更新变量:
let x = prompt("Enter number"); if (x > 5) { let y = prompt("Enter another number"); let z = prompt("Enter another number"); let big = y; // 仅在此处声明一次 if (y > z) { big = y; // 直接赋值,不再重新声明 } else if (z > y) { big = z; // 直接赋值,不再重新声明 } for (let i = 0; big > i; i++) { console.log("hello"); } }
内容的提问来源于stack exchange,提问作者Yoan
相关产品推荐
相关产品推荐

