【问题标题】:Javascript variable lifecycle, will the variable be copied when it is returned?Javascript变量生命周期,变量返回时会被复制吗?
【发布时间】:2013-03-30 13:03:48
【问题描述】:

没有代码很难描述这种情况。 我的修改使一些答案变得无关紧要。我在这里过去了原始代码和下面的简化版本:

function Entity(){
  var value = {};

  return {
    'value': value
  };
}

var e1 = Entity();
var e2 = Entity();
alert(e1.value === e2.value);

我认为它应该返回 true。但实际上,它返回 false。从函数Entity返回的'value'是否被复制?

更新 我想我现在知道原因了。每次实体函数调用表达式“var value={};”将生成一个新对象。谢谢。

【问题讨论】:

  • {0, 1} 不等于 {0, 1}... 相同的概念
  • 我知道 {0,1} 不等于 {0,1}。我的问题是为什么 e1.value 和 e2.value(在简化版本中)没有引用函数中的同一个实例。
  • 因为在您创建的每个作用域中都会重新创建引用(即,每次都创建一个新的“value”)。看herebc 都包含对原始a 的引用。但是,here,两者都指的是不同的“a
  • 另外——你介意去掉上面代码中的原始版本吗?这只是让读者感到困惑。

标签: javascript function


【解决方案1】:

值在返回时不会被复制,但是每当您运行实体函数时都会创建一个新对象。

您可以使用简单的代码来观察“新对象”的创建,例如

console.log({} === {}) //should give false

var a = {};
console.log(a === a); //should give true

并且您可以通过在运行函数时分配更多变量来检查返回时不会复制内容

var a,b,c;

function Entity(){
   var value = {};
   a = value;
   b = value;
   return value;
}

c = Entity();

console.log(a==b, a==c, b==c); //should all give true

【讨论】:

  • 值得一提的是,通常不同的对象永远不会相等(在严格或抽象的比较中),并且只能比较数字、字符串和布尔值。
【解决方案2】:

[elements...] 语法创建一个新数组。 在 javascript 中,=== 运算符按引用(而不是按内容)比较数组,所以结果是 false

【讨论】:

  • 您介意删除您的答案吗?因为我修改问题后,现在不适用了。谢谢。
【解决方案3】:

您的函数当前每次被调用时都会创建一个新对象。

保持与示例中相同的界面,要共享相同的数组,您可以执行以下操作 ->

Entity = (function () {
    //this variable is accessible only in the scope of this function
    var messageBoxes = ['hello'];

    //we return a function that return an object that will make the private messageBoxes variable accessible through it's messageBoxes property.
    return function () {
        return { messageBoxes: messageBoxes };
    };
})(); //note that this function will be self-executing


alert(Entity().messageBoxes === Entity().messageBoxes);

但是,您不会在这里获得任何东西,因为您将让私有 messageBoxes 变量直接公开访问。

【讨论】:

    猜你喜欢
    • 2016-12-20
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多