为何未定义变量在while循环条件中可运行?JS与Python差异
JavaScript while循环变量定义问题解析
先看你写的这段代码:
function pedirContra(){ while(contra!="felix123"){ alert("A"); } }
原代码无反应的原因
调用这个函数后,代码会先执行while的条件判断contra != "felix123"。此时contra是完全未声明的变量,在非严格模式下,JavaScript尝试读取未声明的变量会直接抛出ReferenceError,函数直接终止执行——你觉得“没反应”,大概率是没注意到浏览器控制台的错误提示,代码在报错后就停了,根本没机会进入循环体。
循环内部用var定义后能运行的原因
如果把代码改成在循环内部用var声明contra:
function pedirContra(){ while(contra!="felix123"){ var contra; alert("A"); } }
这就要说到JavaScript的**变量提升(Hoisting)**特性:var声明的变量会被提升到所在作用域的最顶部,不管它写在代码的哪个位置。上面的代码相当于被JavaScript偷偷改成了这样:
function pedirContra(){ var contra; // 提升到函数顶部,初始值为undefined while(contra!="felix123"){ alert("A"); } }
此时contra是已声明的变量,初始值是undefined,undefined != "felix123"的结果是true,所以循环会一直执行,不断弹出alert("A")。
和Python的差异
Python是逐行解释执行的,没有变量提升机制:当执行到while contra != "felix123"时,会直接检查contra是否已定义,未定义就立刻抛出NameError,不会往下走。而JavaScript会先在编译阶段处理所有变量声明,再进入执行阶段,这就是两者行为不同的核心原因。
关于“是否读取while循环内容”的疑问
JavaScript不会在编译阶段执行循环体代码,但会处理循环体内部的变量声明(比如var的提升)。循环体的代码只有在条件为true时才会执行,但变量声明的提升是在编译阶段就完成的,和循环条件是否成立无关。
内容的提问来源于stack exchange,提问作者Fire Frekox
相关产品推荐
相关产品推荐

