前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JavaScript的对象引用

JavaScript的对象引用

作者头像
libo1106
发布2018-08-08 15:43:47
9440
发布2018-08-08 15:43:47
举报
文章被收录于专栏:Web 开发Web 开发

Demo.1

代码语言:javascript
复制
var a = {test:1};
var b = a;
b.test = 2;
console.log(a.test);

简单的Demo,猜猜结果是什么?

javascript-obj-reference
javascript-obj-reference

toobug的圈圈图

  1. 创建对象{test:1},并将该对象在内存的引用地址,传递给a变量,a变量的值是对象{test:1}的引用。
  2. 复制a的值给变量b,也就是,b也获得了对象{test:1}的引用。
  3. 对b.test重新赋值为2,由于b是{test:1}的引用,实则是{test:1}这个对象的test属性的值变更为2。

嗯,这个坑,估计一个不小心就会踩到。

Demo.2

代码语言:javascript
复制
var a = {test: 1};
var b = a;
b = {test: 2};
console.log(a.test)

嗯,别被惯性思维给坑了,这里的b变量,被赋值了两次,两次都是不同的对象。

Demo.3

代码语言:javascript
复制
function a(){
  var i = 0;
  function b(){
    i++;
    console.log(i);
  }
 
  return b;
}
 
console.log(i); // 显示 ReferenceError: i is not defined
 
var FuncDemo = a();
FuncDemo();
FuncDemo();
 
FuncDemo = undefined;
 
FuncDemo = a();
FuncDemo();

嗯,通过这个Demo,你想到了什么?闭包?

javascript-closure
javascript-closure

在一个函数体内,var变量声明的变量,其作用域只在该函数体内,对于函数体外而言,是不可见的(废话)。

在a()这个函数体内,另有一个函数b(),对内部变量i进行了自加操作(嗯,都在一个作用域下面,绝对合法的操作)。有趣的事来了,当函数a()结尾的时候,把函数b()的引用给return了出去。接着,一个外部变量FuncDemo获得了该引用,此时,有一份a()函数相关的数据,在内存中给实例化了,其内存地址,正是被FuncDemo给引用了。

第二次再执行FuncDemo()的时候,尼玛,a()函数里面的私有变量i,其生命周期,居然超出了a()的生命周期,给持久保存了下来!!

咋办,长久以往,8G内存都不够用啊?

这个时候, FuncDemo = undefined;  FuncDemo被重新赋值,其值成了undefined,不再是刚才那个被实例化对象的引用。嗯,刚才被实例化的对象,没有了外部引用之后,GC可以开始干活鸟。

再赋值一次,一个新的对象又被实例化了。

结语:

感谢好导师TooBug,基础讲解生动活泼。

这个对象引用,很早之前讲过一次,然后第二天就踩坑了。今天重温,依旧很有意思。谁Demo.1\Demo.2都答错了,请喝可乐吧。

闭包,网上各种版本,百家争鸣(这个无所谓啦)。一个作用域内部的函数,return并且被外部对象给引用之后,函数本身居然给实例化了,其内部私有变量也给持久性的保存了。除非引用断掉,否则GC都无法回收。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013-12-102,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Demo.1
  • Demo.2
  • Demo.3
  • 结语:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档