为何JavaScript中移除函数后else if语句无法执行?
问题原因解释
核心问题出在全局作用域的内置name变量限制:
在函数内部时,
var name是函数作用域的局部变量,和浏览器全局的window.name完全无关。用户取消prompt弹窗时,prompt返回的null能正常赋值给这个局部变量,else if(name == null)的判断成立,自然会触发对应的提示。把代码移出函数放到全局作用域后,
var name本质是在修改浏览器自带的window.name属性——这个属性有个特殊特性:永远只能存储字符串类型的值。当你把prompt返回的null赋值给它时,会被自动转换成字符串"null"。
这会导致两个关键变化:
if(name)判断会直接成立,因为字符串"null"是非空字符串,属于JavaScript里的“真值”,会直接执行首字母大写的逻辑;else if(name == null)的判断结果为false(字符串"null"和null的相等比较不成立),所以不会触发取消弹窗的提示。
解决办法
把全局作用域里的变量名改成username这类不会和内置属性冲突的名字就行,比如:
var username = prompt("Type your name"); if (username) { var nameParts = username.split(' '); for (var i = 0; i < nameParts.length; i++) { nameParts[i] = nameParts[i].charAt(0).toUpperCase() + nameParts[i].slice(1).toLowerCase(); } var capitalName = nameParts.join(' '); alert("Hello, " + capitalName); } else if (username == null){ alert("The prompt was Canceled."); } else { alert("The name has not typed.") }
内容的提问来源于stack exchange,提问作者user18485824
相关产品推荐
相关产品推荐

