JavaScript解析机制——学习笔记

原文地址:


http://www.cnblogs.com/HPNiuYear/archive/2012/08/27/2657879.html


JavaScript解析机制是什么?

  JavaScript解析过程分为两个阶段,一个是编译阶段,另外一个就是执行阶段。

  * 编译阶段

         编译阶段就是我们常说的JavaScript预解析(预处理)阶段,在这个阶段JavaScript解释器将完成把JavaScript脚本代码转换到字节码。

  * 执行阶段

    在编译阶段JavaScript解释器借助执行环境把字节码生成机械码,并顺序执行。


编译阶段(预解析阶段)做什么操作?


* var , function声明的变量提升

<script>

   alert(a);

   if(false){

      var a=10

   }

</script>

结果显示为undefined,我理解为在运行前,首先将var声明的变量进行声明,并赋值undefined,所以即使运行时还未声明,但是该变量已经存在。



<script>

   AA()

  function AA(){

      alert(a)

      var a=10

   }

</script>

结果为undefined,function声明的函数在运行前会被设置为活动对象的属性(我的理解就是预先加载生成了),所以在运行到声明语句之前便可以调用,

但是函数中声明的变量还是为被赋值,依然是undefined。




* 函数声明与函数表达式在预解析的区别


<script>

   AA()

   var AA=function() {}

</script>

结果报错Object expected. 这段不是很懂,理解为var 和 function 两种在与解析的时候会有冲突,var将变量定义为了undefined所以再指向function时会报错。


* function 覆盖

<script>

   AA()

   function AA(){

      alert(1)

   }

   function AA(){

      alert(2)

   }

</script>

结果为2,同名function,在与解析时最后一个有效。


* 预解析把变量或函数解析到其运行时的环境中

<script>

   aa="out function"

   function AA(){

   alert(aa)

   var aa = "in function"

   alert(aa)

   }

</script>

结果第一个为undefined 第二个为in function 。我的理解为这样的原因是变量查找的就近原则,而不是预解析的原因。


 * JavaScript“预解析”分段进行

<script>

   AA()

   function AA(){

      alert(1)

   }

</script>

<script>

   function AA(){

   alert(2)

   }

</script>

结果为1,function函数的声明是分块的,不同块之间不影响,而var变量不分。












* var 变量提升以及 function 函数声明提升

    该点是对函数声明以及函数表达式进一步的说明,其实前面函数声明和函数表达式在预解析的不同表现,其主要的原因就是 var 和 function 两者不同的提升。这个问题从解析阶段到运行阶段来说明。首先,在解析阶段 var 后面的 AA 会被提升然后 AA 被定义为undefined,BB 也会被提升,而BB被提升后的内容就是整个 function 里面的内容,其实从浏览器的控制台我们可以看出一二。然后,整个解析过程完了就到了运行阶段,在运行阶段期间,当读到 AA() 的时候,其实就是将 AA 这个变量指向function(){}这个函数然后调用,而到了 BB() 的时候,就会从之前声明的函数中去查找该早已经声明的函数,然后直接调用。














  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值