javascript和其他的语言有很多的不同之处,预编译就是其中之一,深挖进去会发现有很多的惊喜,同时也会让你明白其中让你迷惑的地方。      
     javascript代码是分段执行的,以 script为边界。在执行javascript代码段之前会对代码进行预编译。在预编译的过程中,引擎会对作用域内的变量进行声明,并且初始化为undefined,解析定义式函数【注意和匿名函数的区别】。
直接上例题
例1

  1.     mm=2;
  2.     alert(mm);   弹出2
  1.     var  mm=2;
  2.     alert(mm);   弹出2

这里大家都明白,不再多说

例2

  1. alert(mm);
  2. mm=2;    错误提示,mm未定义

我的个人理解是引擎在全局中对代码预编译的阶段,把没有用var声明的全局变量解释为向上一级对象的属性,这里我称之为虚对象,所以会出现未定义的提示

例3

  1. alert(mm);
  2. var  mm=2;  弹出undefined

引擎在对代码段预编译时,把变量定义为undefined;alert执行的时候,mm还没有进行赋值,所以会弹出undefined
下面这段代码跟上面原理一样

  1.    var mm=2;
  2.   (function test()
  3.    {
  4.         alert(mm);
  5.         var mm=3;
  6.    })()        弹出undefined


例4
声明一个定义式的函数【不是匿名函数】

  1.    test()
  2.    function test()
  3.    {
  4.         var mm=2;
  5.         alert(mm);
  6.    }         弹出2

引擎对定义式的函数会进行解析,在test执行前,test这个函数已经解析完毕,所以会弹出2

例5

  1.    test()
  2.    var test=function ()
  3.    {
  4.         var mm=3;
  5.         alert(mm);
  6.    }         出现提示  缺少对象

因为此时匿名函数被赋予给一个变量,而引擎在对变量解析的时候会把变量定义为undefined;另一方面,函数也是对象,test执行的时候,test函数未被解析,所以会出现错误提示 缺少对象

总结:javascript中的代码是分段执行,引擎会对代码进行预编译,把作用域中的变量定义为undefined,解析定义式的函数,匿名函数不会解析,原因不再多说。

posted on 2011-11-21 20:39  十二月的黄昏  阅读(834)  评论(0)    收藏  举报