JavaScript switch-case语句能否更新自身传入的参数?
问题产生原因
核心原因是变量遮蔽+原始值按值传递的JS语言特性:
- 函数声明时设置了和全局变量同名的形参
sw,函数作用域内的sw会优先指向这个形参,和外层全局作用域的sw是完全独立的两个变量,内部赋值不会影响外部变量。 - JS中原始类型(数字、字符串、布尔值等)传参是值传递,你在
onclick里写的lightswitch(sw)只是把当下全局sw的数值传进函数,不是把变量本身的引用传进去,函数内部对形参的修改不会同步到外部的全局变量。 - 每次函数执行完,局部形参就会被销毁,全局
sw始终停在初始值0,所以每次触发switch逻辑都会走到case 0的分支,灯泡只会切到亮的状态,无法来回切换。
可行解决方法
- 方案1(改动最小,逻辑最直接):去掉函数的同名形参,同时移除按钮onclick里的传参,直接在函数内操作全局
sw变量
修正后可直接运行的代码:
<!DOCTYPE html> <html> <body> <button onclick="lightswitch()">Light Switch</button> <img id="myImage" src="pic_bulboff.gif" style="width:100px"> <script> var sw = 0; function lightswitch(){ switch(sw){ case 1: document.getElementById('myImage').src='pic_bulboff.gif' sw = 0; break; case 0: document.getElementById('myImage').src='pic_bulbon.gif' sw = 1; break; } } </script> </body> </html>
- 方案2(无全局变量依赖):不需要额外声明
sw变量记录状态,每次点击直接读取当前灯泡图片的src判断当前状态,对应切换即可,从根源上避免作用域问题:
function lightswitch(){ const img = document.getElementById('myImage'); // 判断当前是灭灯状态就切亮,反之切灭 switch(img.src.includes('bulboff')){ case true: img.src = 'pic_bulbon.gif'; break; case false: img.src = 'pic_bulboff.gif'; break; } }
- 方案3(不推荐,仅作原理说明):如果要保留传参写法,修改全局变量时显式指定浏览器全局作用域(全局变量默认挂载在window对象上),但这种写法冗余度高:
var sw = 0; function lightswitch(localSw){ switch(localSw){ case 1: document.getElementById('myImage').src='pic_bulboff.gif' window.sw = 0; break; case 0: document.getElementById('myImage').src='pic_bulbon.gif' window.sw = 1; break; } }
内容的提问来源于stack exchange,提问作者user19228127
相关产品推荐
相关产品推荐

