下午看了JS引擎的运行过程,其中有个环节是预解析,这里面潜藏着许多在JS开发过程中遇到的麻烦的根源。
先奉上熟悉的代码:
alert(i)
var i=0;
执行结果,弹出undefined。为什么是这样呢,这里就来寻找根源,就是本文的中心思想,JS预解析。
在JS引擎解析的时候,看到var i=0这行就先把i预先声明了(意思就是再代码执行前的动作),但不会给它赋值就形如下面:
var i;
alert(i)
i=0;
这样看来就很理所应当了。这里还要提出的:
alert(a)
var a = function(){}
和刚才的那个一样的结果,只不过这个function可以作为变量使用。
除了var还有function也会预声明,这里有点特殊,是函数就不仅仅是声明了,而且还把匿名函数给了这个变量:
alert(a)
function() a{}
这里就不是undefined了而是function了。甚至可以直接执行:
a()
function a(){alert(1)}
因为在执行a()之前,预解析已经把一个function赋值给a了
这里就有个问题,当var a=1和function a(){}同时被预解析的时候,会最终执行function a(){}:
alert(typeof a)
var a = "x";
function a(){}
和
alert(typeof a)
function a(){}
var a = "x";
弹出的结果都是function