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

JS中在if else 中定义 function 的问题

JS中在if else 中定义 function 的问题

慕斯王 2019-04-13 08:46:39
代码如下:(function(){if(true){inner();functioninner(){alert(1);}}else{}})()在IE8-11、chrome、safari中均弹出了alert(1);但是在firefox31.0中提示了innerisnotdefined;但是改成下面这样就可以了:(function(){if(true){functioninner(){alert(1);}inner();}else{}})()是SpiderMonkey的BUG吗?再补充一点:(function(){if(true){inner();}else{}functioninner(){alert(1);}})()这样的话在所有浏览器下都是正常的,alert(1)了
查看完整描述

2 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

console.log(typeoffoo);
functionfoo(){return1;}
console.log(typeoffoo);
上面这段代码在各个浏览器中有一样的结果:"function"、"function"。
这是没有浏览器差异的行为,原因是函数声明提升(FunctionDeclarationHoisting)。
不明白函数声明提升,或者连函数声明和函数表达式的分别都不太清楚,可以看看汤姆大叔的《揭秘命名函数表达式》。
表达式和声明存在着十分微妙的差别。函数声明会在任何表达式被解析和求值之前先被解析和求值,即使你的声明在代码的最后一行,它也会在同作用域内第一个表达式之前被解析/求值。
console.log(typeoffoo);
if(true){
functionfoo(){return1;}
}
console.log(typeoffoo);
上面这段代码在Gecko引擎中打印"undefined"、"function";而在其他浏览器中则打印"function"、"function"。
原因在于Gecko加入了ECMAScript以外的一个feature:条件式函数声明。
Conditionallycreatedfunctions
Functionscanbeconditionallydeclared,thatis,afunctiondeclarationcanbenestedwithinanifstatement.
Note:Althoughthiskindoffunctionlookslikeafunctiondeclaration,itisactuallyanexpression(orstatement),sinceitisnestedwithinanotherstatement.Seedifferencesbetweenfunctiondeclarationsandfunctionexpressions.
注意引用的Note:条件式函数声明跟函数表达式的处理方式一样。因此,条件式函数声明丧失了函数声明提升的特性。
基于以上原因,请不要在你的代码里将函数声明嵌套在条件语句内。
                            
查看完整回答
反对 回复 2019-04-13
?
UYOU

TA贡献1878条经验 获得超4个赞

ES5之前JS有一个特性叫做声明提前(具体请自行Google),但是在ES6中已经取消了这个"feature"了。所以有可能是Firefox已经开始支持ES6了?
                            
查看完整回答
反对 回复 2019-04-13
  • 2 回答
  • 0 关注
  • 558 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信