`
yuyongkun4519
  • 浏览: 43032 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JavaScript预编译

 
阅读更多

js预编译:

如下实例:

function a(a,b,c){
  console.log(a);
  var a=123;
  function a(){}
  console.log(a);
  var b=function(){};
  console.log(b);
  function c(){}
  console.log(c);
}
a(1,2,3);

要想准确得到打印结果,必须对js预编译有深刻的理解。只有理解了预编译才能够更好的理解js函数的执行过程。

预编译发生在函数执行的前一刻,预编译有四个过程:

1,创建activation object(简写:ao)

2,寻找形参和变量声明,将形参和变量名作为ao属性名,默认值都是undefined

3,将实参值和形参统一

4,寻找函数体中函数声明,将函数体赋值给ao中对应的属性

 

按照上述规则,a函数执行前,在预编译阶段ao对象属性变化过程是:

1,创建ao对象

ao{

}

2,寻找函数体中ao属性名

ao{

a:undefined,

b:undefined,

c:undefined

}

3,实参赋值给形参

ao{

a:1,

b:2,

c:3

}

4,寻找函数体中函数声明赋,值赋予函数体

ao{

a:function a(){},

b:2,

c:function c(){}

}

预编译的结果是:

ao{

a:function a(){},

b:2,

c:function c(){}

}

然后函数开始执行,执行到第一行console.log时a值时function a(){},第二行为a赋值123,此时

ao{

a:123

b:2,

c:function c(){}

}

所以console.log(a)==>123

执行到console.log(b)时ao为:

ao{

a:123

b:function(){},

c:function c(){}

}

所以console.log(b)==>function(){}

 执行到console.log(c)时ao为:

ao{

a:123

b:function(){},

c:function c(){}

}

所以console.log(c)==>function c(){}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics