代码之家  ›  专栏  ›  技术社区  ›  Adam Lee

当使用var=this时,它是复制的还是引用的?

  •  0
  • Adam Lee  · 技术社区  · 6 年前

    当我们使用 var that = this ,是复制还是引用。看起来像 this 是一个特殊的物体,所以 that 应该是一个参考。这意味着什么时候 变化, 那个 也应该改变吗?显然不是这样,因为 那个 保持不变。

    有人能澄清这一点吗?为什么? var that=这个 是一种“价值复制”?

    2 回复  |  直到 6 年前
        1
  •  6
  •   T.J. Crowder    6 年前

    它正在复制一个名为对象引用的值 this 变量 that . 它不是一个特殊的物体,这就是 全部的 对象在javascript中被引用(包括数组和函数):存储在变量(参数、属性等)中的是 参考 指向内存中其他位置的对象,而不是对象的副本。

    假设你有这个:

    var a = {
        answer: 42
    }; 
    

    创建新对象并将引用存储在 a . 在内存中,您有类似的东西:

                    +−−−−−−−−−−−−+
    a:Ref3554−−−−−−>|  (object)  |
                    +−−−−−−−−−−−−+
                    | answer: 42 |
                    +−−−−−−−−−−−−+
    

    在这里,我使用了ref3554来表示引用值,但这纯粹是概念上的;在代码中永远看不到实际值。

    当你这样做的时候:

    var b = a;  // Copies the value 
    

    它复制了 (参考)至 b :

    a:Ref3554−−−+
                |   +−−−−−−−−−−−−+
                +−−>|  (object)  |
                |   +−−−−−−−−−−−−+
    b:Ref3554−−−+   | answer: 42 |
                    +−−−−−−−−−−−−+
    

    在您的示例中是一样的,只是 而不是 那个 而不是 .

    这意味着什么时候 变化, 那个 也应该改变吗?

    无法在范围内更改。但是 可以,那么让我们继续 . 假设我这样做:

    a = {
        question: "Life, the Universe, and Everything!"
    };
    

    我创建了一个新对象并将其分配给 . 发生什么事 ?

    什么都没有:

                    +−−−−−−−−−−−−−−−+
    a:Ref4269−−−−−−+|   (object)    |
                    +−−−−−−−−−−−−−−−+
                    | question: ... |
                    +−−−−−−−−−−−−−−−+
    
                    +−−−−−−−−−−−−+
    b:Ref3554−−−−−−>|  (object)  |
                    +−−−−−−−−−−−−+
                    | answer: 42 |
                    +−−−−−−−−−−−−+
    

    注意如何 得到一个新的参考(参考4269)。这对 . 没有任何联系(也没有 那个 在您的示例中)。它们只是在一段时间内包含相同的值,然后(如上所述),它们不再包含,因为其中一个被更改了。

    但让我们回到他们都指向同一件事的时候:

    var a = {
        answer: 42
    };
    var b = a;
    
    答:参考3554+
    |+__________+
    +__>(对象)|
    |+__________+
    B:参考文献3554+答案:42|
    +__________+
    

    假设我改变 状态 这两个目标 是指?

    a.answer = 27;
    

    发生了什么事 ?好, 是不变的,但它指向的对象与 指向,而该对象的状态刚刚更改,因此您自然会看到新的状态,而不管您使用哪个变量来访问该对象:

    a:Ref3554−−−+
                |   +−−−−−−−−−−−−+
                +−−>|  (object)  |
                |   +−−−−−−−−−−−−+
    b:Ref3554−−−+   | answer: 27 |
                    +−−−−−−−−−−−−+
    
        2
  •  2
  •   Paul    6 年前

    事实并非如此。 that 引用与完全相同的对象 this :

    new function ( ) {
        var that = this;
        this.x = 5;
        console.log( that );
    }

    如果你想知道为什么 在内部函数中可以是不同的。基本上只是阴影。javascript中的每个常规函数调用都有自己的 所以任何 无法访问外部作用域的。这个例子:

    new function ( ) {
        var that = this;
    
        console.log( this === that ); // true
    
        new function ( ) {
            console.log( this === that ); // false
        };
    
        console.log( this === that ); // true
    }

    与此类似:

    var a = { };
    var b = a;
     
    console.log( a === b ); // true
    (function ( ) {
        var a = { };
        console.log( a === b ); // false
    })();
     
    console.log( a === b ); // true

    但箭头函数不是这样的:

    new function ( ) {
        var that = this;
    
        console.log( this === that ); // true
    
        (_ => console.log( this === that ))(); // true, arrow function has the same this as outside
    
        console.log( this === that ); // true
    }