1

我不知道为什么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);
4

2 回答 2

4

正如所写的那样,它current_index只是获取初始index- 它不会反映对该值的任何更改,因为该变量是原始类型。

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

您需要制作current_index一个返回当前值的函数index,或者将其编写为 a getter,通过不可见地调用函数返回当前值,您可以将.index其视为只读属性。

有关后一种方法的示例(需要 ES5 或 shims 来复制功能),请参阅http://jsfiddle.net/alnitak/WAwUg/,它将您当前的return块替换为:

var interface = {
    add: add,
    show: show
};

Object.defineProperty(interface, 'index', {
    get: function() {
        return index;
    },
    enumerable: true
});

return interface;
于 2012-10-20T22:42:37.270 回答
1

Javascript 总是按值传递,除非变量引用对象。因此,您对current_index的初始化只是获取index的初始值,而不是永久指向变量,因此在初始化之后,这两个变量处于不同的方式,因此递增index不会递增current_index

于 2012-10-20T22:54:11.517 回答