谷歌浏览器和Node里面的V8引擎以及JaveScript的执行过程

1.谷歌浏览器和Node里面的V8引擎

 2JavaScript的执行:

1)概念

(1)全局对象Global Object(GO) 新版本叫VE VariableEnvironment  变量和函数声明叫做环境记录:Environment Record:当代码开始执行的时候会建立全局对象,里面存放全局作用域下的属性和函数声明

(2)执行上下文栈(Execution Context Stack,简称ECS):执行代码的一个栈,执行先进后出的原则,包括全局执行上下文栈和函数执行上下文栈。

(3)Execution Context(EC)就是代码块:包括Global Execution Context(EC)全局执行代码块和Functional  Execution Context(FEC)函数执行代码块(包括三部分:1,this绑定的值2.作用域链,由自身AO和父级的对象组成,当需要值的时候,会一层层的去查找 3.AO:包括形参、arguement、函数定义、指向函数的变量)

( 4)Activation Object(AO)函数对象:AO中包含形参、arguments、函数定义和指向函数对象、定义的变量; 

2)过程

执行上下文栈执行全局执行代码块包括两个过程,一是将变量和函数声明放入全局对象,二是执行赋值或执行其他函数          函数执行代码块也是如此
当一段代码开始执行的时候:
a、首先会把代码放入全局执行上下文栈
b、然后创建对象
c、对象里声明属性和函数,此时变量不赋值,所以是undefined,如果遇到函数,会创建一个函数对象,并且在全局对象里对该函数的值以内存地址的形式储存,地址指向函数对象
d、第二步进行代码执行,遇到变量赋值就在全局代码块里面对变量进行赋值,遇到函数就会创建函数执行上下文栈和AO对象,遇到变量定义就放入AO,值也是undefined,函数也是和全局遇到的时候一样处理,然后进行执行赋值,和全局处理一样,
e、当函数执行完后,如果没有AO被指向,当前函数上下文栈和AO对象会被销毁
第二部分:作用域链:由VO(在函数中就是AO对象)和父级VO组成,查找时会一层层查找;
p 第三部分:this绑定的值:这个我们后续会详细解析;

3)面试题

var n = 100

function foo() {
  n = 200
}

foo()

console.log(n)

面试题一:1,先创建全局执行上下文栈 2.创建全局对象 3.把n放到全局对象 4.foo放到全局对象5.执行全局上下文 赋值n为100 6.执行foo函数 7.创建foo执行上下文 8.执行n=200 n找不到就到全局找 然后给n赋值200  打印n 是200

var a = 100

function foo() {
  console.log(a)
  return
  var a = 200
}

foo()

面试题2:先创建全局上下文栈 2.创建全局对象 3.a放到全局对象 4.foo放到全局对象 5.创建foo对象 6.执行全局上下文栈 7.赋值a=100 8.执行foo 创建foo执行上下文栈 9.把a放到执行上下文里 10.打印a 是unde

4)概念图(左边是执行上下文,中间是AO和GO,右边是函数对象)

 

注意 
(1)函数作用域链是由代码的书写位置决定的,所以在当前位置找不到,会去代码书写位置的上一层作用域找。
(2)当打印没有的东西的时候会报错 比如没有定义m 然后打印m 会报m is undefined的错
(3)当m=10的时候 要根据js引擎 不同的js引擎会有不一样的执行  v8会把函数内的m变成全局的
function foo() {
   b = 10
}

foo()
console.log(b)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值