为了账号安全,请及时绑定邮箱和手机立即绑定

js函数根据条件定义时出问题

js函数根据条件定义时出问题

慕田峪4524236 2019-04-16 20:26:11
在网上看到这样一段代码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();
是函数被覆盖了
                            
查看完整回答
反对 回复 2019-04-16
?
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();//执行
纯手打,如果对题主有帮助,很高兴。
                            
查看完整回答
反对 回复 2019-04-16
  • 2 回答
  • 0 关注
  • 540 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号