JavaScript的对象引用

Demo.1

var a = {test:1};
var b = a;
b.test = 2;
console.log(a.test);

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

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

var a = {test: 1};
var b = a;
b = {test: 2};
console.log(a.test)

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

Demo.3

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,你想到了什么?闭包?

在一个函数体内,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都无法回收。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏闵开慧

java概念1

public static void main(String[] args) {//其中[]也可以写在args后面,args也可以随便写成其他字母,例如asd...

36111
来自专栏数据结构与算法

病毒

【问题描述】   有一天,小y突然发现自己的计算机感染了一种病毒!还好,小y发现这种病毒很弱,只是会把文档中的所有字母替换成其它字母,但并不改变顺序,也不会增加...

5557
来自专栏ShaoYL

OC语言Block 续

1399
来自专栏编程微刊

JS数组去重的6种算法实现以上就是为大家提供的6种JS数组去重的算法实现,希望对大家的学习有所帮助。

2062
来自专栏陈满iOS

iOS基础·属性的修饰词与setter的关系

可以自己手动为实例变量在头文件 中声明setter、getter方法,并在实现文件中实现setter、getter方法。你也可以不声明不实现,但不要再企图调用s...

1802
来自专栏黑泽君的专栏

【Java面试复习经典】传智播客Java就业班入学测试题及答案解析(2012年版)

  共50道题,每道题2分,总分100分,80分为合格。   注意,题目有多选,也有单选。请认真作答。

1833
来自专栏谦谦君子修罗刀

swift4.0语法杂记(精简版)

一、swift简史 1、介绍 swift是苹果公司于2014年推出用于撰写OS和iOS应用程序的语言。它由苹果开发者工具部门总监“克里斯.拉特纳”在2010年...

4599
来自专栏程序你好

C# 7.3新特性一览

1033
来自专栏决胜机器学习

Redis专题(二) ——Redis数据类型(2)

Redis专题(二)——Redis数据类型(2) (原创内容,转载请注明来源,谢谢) 四、列表类型(List) 列表类型可以存储一个有序的字符串列表,其存储...

3476
来自专栏ShaoYL

OC语言Block 续

33512

扫码关注云+社区

领取腾讯云代金券