JS变量对象

经历了春招的摧残后,感觉自己综合知识有所欠缺,之前学的js也不扎实,所以决定戒骄戒躁,从现在起开始每天写点什么,有什么错误还请指出,博主虚心接受。
在学习js执行上下文的时候看到的,之前都没听过,所以就去查阅一番,看过后觉得可以加深对js运行机制理解,在此总结记下。

什么是变量对象?

由执行上下文创建,用来存储执行上下文中定义的变量和函数声明。

变量对象不能在JavaScript环境中访问,只有进入一个执行上下文中时,该执行上下文的变量对象才会被激活,被激活的变量对象变为活动对象,此时它上面的各种属性能够被访问。

读着感觉好抽象,所以在这举个例子:
全局上下文的变量对象就是window,window其实是变量对象的一个属性,这个属性引用变量对象自身;还有一个属性this也是指向全局上下文的变量对象。

变量对象创建过程及构成

如前文所说,变量对象是由执行上下文创建的。在进入执行上下文时,会创建并初始化变量对象,规则是:

  1. 创建arguments属性,检查当前上下文中的参数,创建形参和实参为键值对组成的对象,arguments指向这个对象。(如果没有实参,属性值设为undefined)
  2. 对于当前上下文中的函数声明,变量对象创建以这些函数名为属性,值为指向函数所在内存地址的引用 这样的键值对。如果有相同的函数名,它那么作为变量对象的属性,对应值就会被覆盖。(JS高级程序设计时看到的,在这附上:如果函数是匿名函数,function后没有标识符,也会创建键值对,属性名为空字符串。)
  3. 对于当前上下文中的变量声明,都会在变量对象以变量名创建一个同名属性,值为undefined,如果该变量名属性已经存在,会直接跳过,原属性值不会被修改(防止同名函数被修改为undefined)

上代码来加深理解:

function test() {
	console.log(a)	//打印为函数a
    var a
    console.log(a)	//打印的仍然为函数a
    a = 1
    console.log(a)	// 1
    function a(){
      return '我是函数a'
	}
}
test()
function test(){
	console.log(a)	// undefined
    console.log(b); // 报错, ReferenceError: b is not defined;因为没有变量b的声明
    var a = 'a';
   	b = 'b'
   	console.log(b);	// b ,只有执行到b赋值时,才会给变量对象增加属性b及值。
}
test()

学习了变量对象后,我就不会像之前写的博客中的那样简单的说基本数据类型存储在栈内存中,而会说它是以键值对形式存储在变量对象中。
这也是我为什么决定戒骄戒躁学习的原因:通过慢慢的学习,刷新了我对这些事物的认知,看待这些知识也会越来越深入。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值