JavaScript 闭包 : Shouldn't this array not be editable via getArray?

标签 javascript arrays closures instantiation

目标 1 是只允许通过 getArray获取arr 信息。
目标 2 是只允许通过 addToArray设置arr 信息。

function TestObj(){
  var arr = [];
  var b = 3;

  this.getArray = function(){
    return arr;
  };
  this.addToArray = function(val){
    arr.push(val);
  };

  this.getNumber = function(){
    return b;
  }
  this.setNumber = function(val){
    b = val;
  }

}

var obj = new TestObj();

obj.addToArray('derp');
console.log(obj.getArray());

//['derp']

obj.getArray().push('aderp');

console.log(obj.getArray().length);

//2

我很困惑。 getArray 不是返回指向存储在 arr 中的数组的指针,而不是 arr 本身吗? 这是闭包 101,我是否在某处忘记了 ()?

<小时/>

思考过程:

因为
obj.getNumber()
返回 3,


obj.setNumber(4)
其次是
obj.getNumber()
返回 4

调用:
obj.getNumber() = 5
失败并显示“无效的左手...”

既然如此,为什么

obj.getArray().push('thing')

可以访问数组...它是在函数中声明的变量...这应该是闭包内的变量,只能通过 getArray/addToArray api 访问...

最佳答案

您需要返回一个不引用原始数组的数组。

浅复制

this.getArray = function(){
    return arr.slice(0);
};

深度复制

this.getArray = function(){
    return JSON.parse(JSON.stringify(arr));
};

关于JavaScript 闭包 : Shouldn't this array not be editable via getArray?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28243775/

相关文章:

c - 从文件读入数组并使用数组中的数字执行操作

swift - 在实例闭包变量中使用 self

Java Lambda 和闭包

javascript - 在 JavaScript 函数之间传递 JSON 值

javascript - 用于跳转/单击的 jQuery/jQuery UI slider 事件。函数未触发

javascript - JQuery AJAX 检索对象数组

java - Scala 包装通用匿名类

javascript - 在 JavaScript 中动态创建 JSON 数组键

javascript - 使 django 的消息出现在 Javascript 警报而不是 html 中?

C 返回字符串数组