JavaScript变量name导致prompt取消逻辑异常问题求助
问题原因分析与解决办法
你碰到的是浏览器全局对象内置属性冲突的典型问题,我来给你拆解清楚:
核心问题:name是浏览器的内置全局属性
当你在全局作用域(没有包裹在函数里)用var name声明变量时,你其实不是在创建一个全新的全局变量,而是在给浏览器自带的window.name属性赋值。这个属性有个特殊的强制规则:
window.name永远会被转换成字符串类型,不管你给它赋什么值。
你的代码出问题的具体过程
当你点击取消或按Esc时,prompt()返回的是null,但把null赋值给window.name时,浏览器会自动把它转成字符串 "null"。这时候你的条件判断:
if( name == null ) { ... }
就变成了 "null" == null——这个等式是不成立的(字符串和null用==比较结果是false),所以代码直接跳过了第一个条件,走到了else分支,弹出了"I don't know you"。
为什么改成usr就正常?
因为window.usr不是浏览器的内置属性,你用var usr声明的是一个普通的全局变量,它能正确保存prompt()返回的null值,条件判断usr == null自然就会成立,触发对应的"Cancelled"提示。
给你的几个小建议
- 尽量避免在全局作用域使用和
window内置属性重名的变量,比如name、top、self、location这些都是浏览器自带的属性,别拿来当变量名。 - 优先用
let或const代替var声明变量:let/const声明的全局变量不会挂载到window对象上,就算不小心用了name,也不会和window.name冲突(不过还是建议避开内置属性名哦)。
内容的提问来源于stack exchange,提问作者lencdv
相关产品推荐
相关产品推荐

