先看这么一段代码
(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的经典
先声明后实现的规范来编程。