JS:通过暴露方法改变数据?

时间:2014-09-24 08:01:59

标签: javascript closures

我找不到与此类似的问题,如果有一个请引导我去看灯。 我有以下代码片段:

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]

由于

2 个答案:

答案 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.
        }
    }
}();