js原理之执行上下文

个人笔记 不足请指正。

js在执行时

语法分析

在执行之前会通篇扫描 有没有语法错误

1.imply global 暗示全局变量,即任何变量,如果变量未经声明就复制,此变量就为全局所有。

2.一切声明的全局变量,全是window的属性

函数执行的前一刻:

1.创建AO对象

2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined 

       (函数声明整体提升,变量声明提升)

3.将实参值和形参统一

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


执行js


了解执行上下文要先了解下边两点

1.栈

栈是类似于数组的一种数据结构

2.引用对象

如果变量是一个对象,实际上变量中存放的是对象的地址


执行上下文:某个函数或全局代码的执行环境,该环境中包含执行代码需要的所有信息

可以简单的理解为:执行上下文是一个对象,对象中包含了执行代码所需要的信息

当执行一个函数时,需要建立执行上下文,建立之后,才正式开始执行。

call stack(执行上下文栈):组织管理程序运行过程中的执行上下文。

 

执行上下文的内容

1.VO:variable object , 变量对象,存放的是函数或全局代码执行过程中需要用到的局部变量

2.scope:作用域

3.this


VO是一个对象,调用函数或执行全局代码时创建,创建一个vo,需要经过三步:

1.确定函数形参的值(包括arguments对象)

在函数中寻找数据是,会先从vo中查找,如果vo中不存在,在使用外层数据

AO :active object 执行栈顶上下文的vo

也有人叫VO叫GO,在这里是没有区别的 

GO:Global Object 


创建vo对象 

1.确定形参值

2.确定函数中所有的函数字面量声明

        1.该函数必须是字面量声明,字面量声明提取到vo后,可以认为该声明失效

        2.如果当前vo中出现同名属性直接覆盖

3.确定函数中所有的变量声明(var),将其提取到上下文中,值为undefined

        1.如果当前vo中出现同名属性,忽略


下面来做几道测试题


12行输出。//张三,张三

user1变量是一个对象,user1存放的是对象的地址

user2=user1  故指向同一个地址

当第10行改变name时 因为user1和user2指向同一个地址

故console.log(user1.name)输出的是张三

在实际开发中为了避免出现这种情况通常会对一个对象深拷贝在赋给另一个变量;

19执行,16输出1


输出。abc  ,123

试题3:

console.log(foo)//function

var foo="A";

console.log(foo);   //A

var foo=function(){

      console.log("B")

}

console.log(foo);

foo();

function foo(){

     console.log("C")

};

console.log(foo)

foo()

试题4:

var foo=1

function bar(a){

    var a1=a;

    var a=foo;

    function a(){

        console.log(a)

    }

    a1()

}

bar (3)

bar 里的函数a又一个vo建立了

vo{

}

bar的上下文

vo{

    a:指向函数a,

    a1:指向函数a,

}

全局上下文

vo{

    bar :指向函数bar;

    foo:1;

}

不同的作用域。就会生成不同的vo ao







转载于:https://juejin.im/post/5ce54c81518825314b6d6283

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值