function声明函数在浏览器中这么一个问题

先看这么一段代码

(function(){

  alert( myname() );

  function myname(){

    return "nick"

  }

})();

上面代码在各个浏览器里的运行结果是一致的,这是因为在javascript里面,用function 声明的函数

是会在函数执行环境初期便构造完函数体,也可以说是一种预解析吧,于是,即便myname的声明代码

在myname的执行后面,也是可以正确的执行的。

但是我们这样修改下

(function(){

  alert( myname() );

  if (true) {

    function myname(){

      return "nick"

    }

  }

})();

然后会发现浏览器的解析出现了差异。

最新版本的firefox和ie8 会抛出错误异常 ReferenError: myname is not defined

是的,其他浏览器均正常。

也就是说,上面的匿名函数的执行环境初始化的时候,其内部活动对象Active Object里面,没有myname这个属性

也就是说,这可能是firefox等做的一些引擎上的优化,加快引擎的效率,块级作用域屏蔽了匿名函数作用域链对该块作用域的初始化。

 

最后,也想在这里疾呼,虽然js很灵活,有他自己的脾性,但是在真正的项目应用里面,还是要有良好的书写规范,最好是按照c的经典

先声明后实现的规范来编程。

转载于:https://www.cnblogs.com/litao229/archive/2012/02/02/2336028.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值