在网上看到这样一段代码varcondition=true;if(condition){functionsayHi(){alert("Hi!");}}else{functionsayHi(){alert("Yo!");}}sayHi();但结果却是yo!为什么呢?
2 回答
海绵宝宝撒
TA贡献1809条经验 获得超8个赞
functionsayHi(){}这种是函数声明式写法,会声明提前,将它置于最接近的环境中(这里是全局执行环境了)。而你两次都是同一个函数名,后一个会覆盖前一个。所以你得到的就是Yo!你的相当于这样:functionsayHi(){alert("Hi!");}functionsayHi(){alert("Yo!");}varcondition=true;if(condition){}else{}sayHi();是函数被覆盖了
SMILET
TA贡献1796条经验 获得超4个赞
没猜错的话这段代码出自于:javascript高级程序设计,因为我也看到这里了。下面摘自书上内容:关于函数声明,它的一个重要特征就是函数声明提升(functiondeclarationhoisting),意思是在执行代码之前会先读取函数声明。表面上看,以上代码在condition为true时,使用一个sayHi()的定义;否则就使用另一个定义。实际上,这在ECMAScript中属于无效语法,javascript引擎会尝试修正错误,将其转正为合理的状态。但问题是浏览器尝试修正错误的做法不一致。大多数浏览器会返回第二个声明,忽略condition;Firefox会在condition为true时返回第一个声明。因此这种使用方式很危险,不应该出现在你的代码中。不过如果使用函数表达式,那就没有问题了。varsayHi;varcondition=false;if(condition){sayHi=function(){alert('Hi');};}else{sayHi=function(){alert('Yo');};}sayHi();//执行纯手打,如果对题主有帮助,很高兴。
添加回答
举报
0/150
提交
取消
