将function声明在if语句中为什么火狐浏览器和其他浏览器解析却不一样

ChinaCompass 2013-05-22 10:21:18
将function声明在if语句中为什么火狐浏览器和其他浏览器解析却不一样呢?
代码如:

<html>
<head>
<script type="text/javascript">
var bl=true;
if(bl)
{
function fun()
{
alert(111);
}
}
function fun()
{
alert(222);
}
fun();
</script>
<head>
<body>
</body>
<html>


对于浏览器来说Ie、谷歌、Opera都表现一致(会弹出222)。为独火狐不一样(会弹出111)!
事由:昨天晚上一个人问我这个问题,当然代码的命名不是这样的,但其本质也是如此!

我给出的答案就是后一个函数会覆盖前一个函数。理由:因为JavaScript有一个预编译处理,自上而下进行扫描进行顶置遇到同名函数后一个会覆盖前一个!但执行时候却不是如此。

难道火狐解析的时候先对顶层或者不在其他代码块的函数进行先处理,然后在处理其他代码款中的函数?

当然我认为以上代码没有实质上的 意义。只是别人问了,我也感觉到奇怪。

如下图:

...全文
182 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChinaCompass 2013-05-22
  • 打赏
  • 举报
回复
引用 5 楼 diyuheixue 的回复:
你好!这存在浏览器差异问题。 其他浏览器进行预编译处理会对所有函数进行预编译处理,自上而下。所以以上代码会弹出222 而火狐只针对顶层函数进行优先编译,语句中的函数按语句执行流程进行预编译! 暂时这么理解吧!看上去是作用域了!哈哈!同时本人也借助你的帖子反馈了火狐,希望得到官方的回复.在未接到官方回复之前暂时先这么理解吧!
感觉你说的还有点道理,希望官方回回复!
ChinaCompass 2013-05-22
  • 打赏
  • 举报
回复
引用 4 楼 ftiger 的回复:
这样写就一至了

var fun = (bl)? function (){
     alert(111);
   } :  function (){
     alert(222);
   } ;

这种写法用预编译可以解释的通的!
孤独皓 2013-05-22
  • 打赏
  • 举报
回复
你好!这存在浏览器差异问题。 其他浏览器进行预编译处理会对所有函数进行预编译处理,自上而下。所以以上代码会弹出222 而火狐只针对顶层函数进行优先编译,语句中的函数按语句执行流程进行预编译! 暂时这么理解吧!看上去是作用域了!哈哈!同时本人也借助你的帖子反馈了火狐,希望得到官方的回复.在未接到官方回复之前暂时先这么理解吧!
ftiger 2013-05-22
  • 打赏
  • 举报
回复
这样写就一至了

var fun = (bl)? function (){
     alert(111);
   } :  function (){
     alert(222);
   } ;

KK3K2005 2013-05-22
  • 打赏
  • 举报
回复
引用 2 楼 ChinaCompass 的回复:
[quote=引用 1 楼 KK3K2005 的回复:] 别钻牛角尖了 不能把你的代码结果 依赖于编译机制 要依赖于逻辑控制
但是其他浏览器为什么没有按逻辑控制执行呢?[/quote] 所以啊。。。。 真没什么好研究的 除非你决定专研底层 不然万一他下个js引擎对于这个的解释方式又不一样了呢
ChinaCompass 2013-05-22
  • 打赏
  • 举报
回复
引用 1 楼 KK3K2005 的回复:
别钻牛角尖了 不能把你的代码结果 依赖于编译机制 要依赖于逻辑控制
但是其他浏览器为什么没有按逻辑控制执行呢?
KK3K2005 2013-05-22
  • 打赏
  • 举报
回复
别钻牛角尖了 不能把你的代码结果 依赖于编译机制 要依赖于逻辑控制

87,992

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧