代码之家  ›  专栏  ›  技术社区  ›  yajiv

为什么“X”在生活中的价值取决于我们获取它的方式?

  •  1
  • yajiv  · 技术社区  · 6 年前

    我有以下js代码。

    var a = (function(){
        var x = 0;
        var y = function(){
            x++;
            console.log(x);
        }
        var z = function(){
            return x;
        }
        return {
            x, y, z
        }
    })();
    

    当我尝试访问 a.x 0 (当x被初始化为0时,应该是这样),然后我增加 x 使用函数 y . 但在增加了 a.x=0 . 我不明白为什么会这样,因为我已经改变了 使用函数 y . 那为什么它没有改变。

    var a = (function(){
      var x = 0;
      var y = function(){
    	x++;
    	console.log(x);
      }
      var z = function(){
    	return x;
      }
      return {
    	x, y, z
      }
    })();
    
    console.log(a.x);
    a.y();
    a.y();
    console.log(a.x);
    console.log(a.z());

    猜测

    2 回复  |  直到 6 年前
        1
  •  2
  •   Pointy    6 年前

    创建并返回对象时:

    return {
      x, y, z
    }
    

    这个 x 对象中的属性接收 复制 局部变量的 . 除此之外,它不会以任何方式绑定到局部变量,因此闭包中对变量的后续更改不会反映在该对象中。

    你可以做一个有活力的人:

    return {
      get x() { return x; },
      y, z
    };
    

    在结尾处。

        2
  •  2
  •   Jonas Wilms    6 年前

    最后一行:

       return { x, y, z };
    

    同:

      return { x: x, y: y, z: z };
    

    所以它 副本 将局部变量导入对象。对于不重要的函数或对象,因为它们是通过引用复制的,但是基本体是通过值复制的,因此有两种不同的方法 z ,局部变量和对象属性。