0

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

function Entity(){
  var value = {};

  return {
    'value': value
  };
}

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

我认为它应该返回true。但实际上,它返回 false。从函数实体返回时是否复制了“值”?

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

4

3 回答 3

1

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

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

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
于 2013-03-30T03:25:41.980 回答
0

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

于 2013-03-30T03:24:54.910 回答
0

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

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

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直接公开访问私有变量。

于 2013-03-30T03:27:05.887 回答