看到文章说垃圾回收机制有两种情况,一种是标记法,一种是引用计数法,看到引用计数法的一个例子,没怎么看明白,文章说:声明一个变量并将一个引用类型值赋给该变量时,这个值得引用次数就是 1。如果同一个值又被赋给另外一个变量,则该值的引用次数加 1。相反,如果包含对这个值的引用的变量又取得另外一个值,这个值得引用次数减 1。当这个值得引用次数为 0 时,则说明没有办法再访问到此值,因此就可以将其占用的内存空间回收。当垃圾收集器在下一个周期运行时,会释放引用次数为零的值所占用的内存空间。function countMethod(){
                  var object1 = new Object(); // 声明变量,计数器由 0 变为 1
                  object1.method1 = "This is object1";  // object1 计数器 -1,object1 读数变为0
            }通过上例看出,正常情况下,当函数运行结束后,object1 object2的读数均为 0,在下一个垃圾收集周期时,会被回收并且释放其所占用的内存。那么:这里的话,这个值代表Object的一个实例,对这个实例的引用的变量是object1,如果object1又取得另外一个值,那么实例的引用次数减一,这里的话,object1.method1 = XXXX,这里object1又取得了另外一个值了么?这不是只是对实例对象的属性的修改么?object1不是还是引用的是Object的实例么?
问题有点多哈,在此先谢过了。

解决方案 »

  1.   

    function countMethod(){
                      var object1 = new Object(); // 声明变量,计数器由 0 变为 1
                      object1.method1 = "This is object1";  // object1 计数器 -1,object1 读数变为0
                }
    这里object1的引用次数是1
    第二句object1并没有指向其他对象,而是定义并给object1的属性进行了赋值
      

  2.   

    值就是对象
    变量是引用这个值的变量
    另一个值是其他的对象的引用
    例如这里的值是object1指向的对象
    变量是object1
    另一个值可以是new Object()
      

  3.   

    这里变量object1的值指向的对象本来不就是new Object()么?
    object1.method1 = "This is object1";
    这句话应该只是对object1的值指向的对象的属性的修改么?为什么说object1又取得了另外一个值呢?
      

  4.   

    不是的,
    每new一次Object都会new出不同的对象
    不妨做下试验吧
    function countMethod(){
                      var object1 = new Object(); // 声明变量,计数器由 0 变为 1
                      object1.method1 = "This is object1";  // object1 计数器 -1,object1 读数变为0
      alert(typeof object1);
                }
    countMethod();
    返回的是object
    说明对象是存在的,也就是object1.method1 = "This is object1";  // object1 计数器 -1,object1 读数变为0
    这一句不对
    应该是读数!0
      

  5.   

    错了,应该是
    function countMethod(){
                      var object1 = new Object(); // 声明变量,计数器由 0 变为 1
                      object1.method1 = "This is object1";  // object1 计数器 -1,object1 读数变为0
      alert(object1 instanceof Object);
                }
    countMethod();
    因为null的typeof也是object