先看这么一段代码

(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的经典

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

 posted on 2012-02-02 17:13 落叶满长沙 阅读(...) 评论(...) 编辑 收藏