猿问

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

代码如下:
(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)了
慕斯王
浏览 559回答 2
2回答

慕森王

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:条件式函数声明。ConditionallycreatedfunctionsFunctionscanbeconditionallydeclared,thatis,afunctiondeclarationcanbenestedwithinanifstatement.Note:Althoughthiskindoffunctionlookslikeafunctiondeclaration,itisactuallyanexpression(orstatement),sinceitisnestedwithinanotherstatement.Seedifferencesbetweenfunctiondeclarationsandfunctionexpressions.注意引用的Note:条件式函数声明跟函数表达式的处理方式一样。因此,条件式函数声明丧失了函数声明提升的特性。基于以上原因,请不要在你的代码里将函数声明嵌套在条件语句内。

UYOU

ES5之前JS有一个特性叫做声明提前(具体请自行Google),但是在ES6中已经取消了这个"feature"了。所以有可能是Firefox已经开始支持ES6了?
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答