作用域js和java区别_js作用域和作用域链

本文详细介绍了JavaScript中的作用域概念,包括全局作用域和局部作用域。在预编译阶段,函数和变量会被收集到相应的作用域中。在代码执行时,通过作用域链来查找变量,确保能正确访问到上下文中的变量。作用域链由当前作用域及上级作用域组成,按顺序查找变量。当在函数内部引用全局变量时,会沿着作用域链向上搜索,直到找到变量或遇到全局作用域。
摘要由CSDN通过智能技术生成

作用域:在js预编译时、代码执行之前对全局或局部的变量进行收集,存放在一指定内存中scope,执行时对scope进行访问,scope 就是全局或局部的作用域。

如:

1 functiontest() {2 var a = 123;3 }4

5 test();

在test() 执行之前对test 进行预编译 生成test 的 scope(AO Activetion Object)。收集test 函数中的变量存放在scope中。

此时test 的scope 为:

{

a:undefined

}

在test 函数执行时 对 scope 中的 a 变量进行赋值,a = 123;

实际上在全局环境进行预编译时也会产生一个作用域,在test 被定义时会在test 函数上定义一个作用域数组([[Scopes]])。并将全局作用域放入test的作用域数组中。

如:

1 var a = 456;2

3 functiontest() {4 var b = 123;5 console.log(b);6 console.log(a);7 }8

9 test();

在全局环境进行预编译时,会生成全局作用域Global

Global {

a: undefined,

test: undefined

}

此时test 函数的作用域数组中就已经包含了Global

test.[[Scopes]] = [Global] // 实际上[[Scopes]] 是不可访问的

全局环境执行完后Global变成

Global{

a: 456,

test: function test() {...}

}

在test 函数执行前会对test函数进行预编译,生成test 函数的scope并放入到test 函数的作用域数组的第一位。

scope {

b: undefined

}

test.[[Scopes]] = [scope,Global] // 实际上[[Scopes]] 是不可访问的

在test 代码执行b= 123时对作用域scope 中的b进行赋值

scope {

b: 123

}

在test 函数中打印a 时会沿着test 作用域数组中的顺序进行查找,首先会查找test 的scope 中是否有a,如果有者直接使用,如果没有沿着[[Scopes]] 继续查找,在Global 中进行查找,所以打印的是Global 中的a的值--456。

如果沿着[[Scopes]] 的顺序找到Global 一直找不到a,就会报错 a is not defined。

由于在访问变量时会沿着[[Scopes]] 查找,这种查找机制类似链条结构,所以称[[Scopes]] 为作用域链。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值