我找不到与此类似的问题,如果有一个请引导我去看灯。 我有以下代码片段:
var GUD = function() {
var all = [1,2,3,4,5];
return {
getAll : function() {
return all;
}
}
}();
这是一个简单的函数隐藏所有变量并通过getAll方法公开它。 为什么可以使用:
更改all数组GUD.getAll() //[1, 2, 3, 4, 5]
GUD.getAll().splice(0,1) //[1]
GUD.getAll() //[2, 3, 4, 5]
由于
答案 0 :(得分:0)
那是因为你要返回数组的引用。因此,当您调用splice
时,它会影响两个数组
返回数组的副本
var GUD = function() {
var all = [1,2,3,4,5];
return {
getAll : function() {
return JSON.parse(JSON.stringify(all));
}
}
}();
答案 1 :(得分:0)
私有变量保护失败的边缘情况之一是when returning the reference types(including arrays)
。而不是返回对象的实际引用,尝试返回对象的副本(在本例中为数组)。
我之前的评论中有一个拼写错误(应该是切片)
var GUD = function() {
var all = [1,2,3,4,5];
return {
getAll : function() {
return all.slice(0); // slice(0) creates a new copy of the array.
}
}
}();