JS高级学习 02

作用域

一、函数执行
1.1 全局代码执行顺序
编译:在执行调用栈(ECStack)中创建一个全局对象(globalobject),将代码中的变量添加到全局对象中,此时变量值均为undefined。

​ 运行:在全局执行上下文(GEC)中有可变对象(VO),指向堆中的全局变量(GO)。在运行过程中通过GO完成对编译过程中变量的赋值。
在这里插入图片描述

1.2 函数执行上下文(FEC)

编译:函数编译过程中会包含父级作用域(parents cope)。父级作用域为函数上一层,父级作用域由编译时确定,与调用时无关)

运行:在函数执行上下文(FEC)中有可变对象(VO),指向堆中的函数变量(AO)。在运行过程中通AO完成对编译过程中变量的赋值。

二、作用域链
2.1 作用域链(Scope Chain)

​ 产生:在编译过程中会形成一个作用域链,在查找变量中实际是通过作用域链查找。

​ 组成:VO+ParentScope

2.2 面试题
var n = 100
fuction foo() {
    n = 200     //此时的n并没有新建变量,n为全局变量中定义的 var n
}
foo()

console.log(n)  //200
fuction foo() {
    console.log(n) //undefined  此时只完成变量n定义,并未赋值
    var n = 200    
    console.log(n)   // 200      此时变量n已完成赋值
}

var n = 100
foo()
var n = 100

function foo1() {
    console.log(n) //100  在父级作用域(gl)中找,看编译不看引用
}

function foo2() {
    var n =200
    console.log(n) //200
    foo1()
}

foo2()  
console.log(n)  //100   在全局作用域找
 var a = 100
 
 function foo() {
     console.log(a)   //undefined
     return         //return返回后不继续往下执行 但在编译中还会编译变量a
     var a = 100
 }

foo()
function foo() {
    var a = b = 100    //var a = 100   b=100
}

foo()

console.log(a)  //访问不到  a定义在AO中,在全局对象中查找不到
console.log(b)  //100    b可看为在全局对象中定义
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值