码迷,mamicode.com
首页 > 其他好文 > 详细

预编译&作用域链

时间:2019-11-11 21:39:29      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:类型   表达式   错误   自己   全局对象   图片   技术   访问   的区别   

形参与实参的区别:

技术图片

 

fun(a,b)是形参   是用来开辟空间的

fun(5,10)是实参  传给a和b的值

相当于在函数里边创建了两个变量并且赋值

技术图片

 

 

1.形参变量:只有被调用时才分配内存空间,结束时释放空间;因此形参只有在函数内部有效。

2.实参:可以是变量,常量,表达式,函数等;无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 因此应预先用赋值,输入等办法使实参获得确定值。

 

JavaScript  运行三部曲

1.语法分析:语法错误不会进行后面操作,反之进行后面操作;

2.预编译:在执行语句前,会进行预编译;

3.解释执行:在编译完了后执行语句;

 

 预编译的4个步骤

1.对局部(函数)创建一个AO对象,对全局的时候创建GO对象。

2.找形参和变量声明,将变量名和形参名作为AO属性名,或GO对象  属性名的初始值是undefined。

3.将实参值传递形参统一

4..在函数体里面找函数声明,值赋予函数体

上代码......

技术图片

 

1.首先全局对象创建GO执行上下文
      GO{
      2.对形参和变量声明,将其作为属性名,值为undefined
        global:undefined --执行后-->100
      3.全局对象没有形参
      4.在函数体里找函数声明,值赋予函数体
        fn:function fn(){};
    }
    执行全局
    1. global = 100
    2.fn();(先预编译fn(),再执行)


    (函数预编译产生AO见下文)


    AO{
    2.对形参和变量声明,将其作为属性名,值为undefined
  //当局部变量AO中存在的时候先找局部变量AO里的变量,这个时候虽然GO全局中存在global为100,但局部中已经有global为undefined
      global:undefined --fn的AO执行到第二句-->200 --fn的AO执行到第四句-->300
      3.没形参
      4.没函数声明
    }
    fn()
    A0执行{
      第一句:console.log(global); //undefined在AO的执行上线中global:undefined;
      第二句:global = 200;
      第三句:console.log(global); //在AO中找global已经变成了200
      第四句:global = 300; 
    }

    所以最后我们的
    GO{
      global:100
      fn:function fn(){};
     }
    AO{
    global:300
    }

 

 

作用域链:[scope]中储存的执行期上下文对象的集合,这个集合叫作用域链

函数也是一个对象中有些我们可以访问的属性(name,prototype)不可以访问的有[scope]属性

[scope]属性:是指作用域,储存了运行期的上下文(AO和GO)集合

 技术图片

 

 

 技术图片图二

在b定义的时候a马上快执行完的时候的图像

首先b会继承了aAO和GO,这里的aAO全等于a中的aAO

在b自己执行的时候会变成(图二)

scope chain中的数值代表数值的key,key代表:

0 ---自己的AO(Activation Object)

1---b的AO

2---GO(Clobal Object)

 

预编译&作用域链

标签:类型   表达式   错误   自己   全局对象   图片   技术   访问   的区别   

原文地址:https://www.cnblogs.com/yang1997/p/11838460.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!