在JavaScript中返回私有变量

时间:2012-10-20 22:39:44

标签: javascript scope

我不知道为什么console.log(Set.current_index)会显示0而不是3

var Set = (function() {
    var set = [];
    var index = 0;

    function contains(set, e) {
        for (var i = 0; i < set.length; i++) {
            if (set[i] === e) {
                return true;
            }
        }
        return false;
    }

    var add = function(e) {
        if (!contains(set, e)) {
            set[index++] = e;
        }
    }

    var show = function() {
        for (var i = 0; i < set.length; i++) {
            console.log(set[i]);
        }
    }

    return {
        add: add,
        show: show,
        current_index: index
    };
})();​

Set.add(20);
Set.add(30);
Set.add(40);
Set.show();
console.log(Set.current_index);

2 个答案:

答案 0 :(得分:4)

由于写入current_index只获取{em>初始值index - 它不反映对该值的任何更改,因为该变量是 primitive type。

如果您有“引用类型”(即对象或数组),则对其内容的更改将在引用同一对象的任何其他变量中可见。原始类型不会发生这种情况,它们会“按值”复制到新变量中,对原始变量的更改不会影响副本。

您需要将current_index转换为函数,以返回index的当前值,或将其写为getter,以便您处理{ {1}}作为只读属性,通过无形地调用函数来返回当前值。

有关后一种方法的示例(需要ES5或shims来复制功能),请参阅http://jsfiddle.net/alnitak/WAwUg/,用以下内容替换当前的.index块:

return

答案 1 :(得分:1)

除了变量引用对象外,Javascript总是按值传递。因此, current_index 的初始化只获得 index 的初始值,而不是永久地指向变量,因此在初始化之后,这两个变量是分开的,因此递增< strong> index 不会增加 current_index