2012-10-20 30 views
1

我不知道为什么console.log(Set.current_index)显示0而不是3返回JavaScript中的私有变量

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

作为写入current_index只是获取的index初始值 - 因为这变量是原始类型的不镜像到该值的任何变化。

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

你需要让current_index功能返回的index当前值,或将其写为getter,它允许您通过无形地调用函数返回的电流值来治疗.index为只读属性。

对于后一种方法的一个例子(其需要ES5,或垫片复制功能)看到http://jsfiddle.net/alnitak/WAwUg/,这与此替换您当前return块:

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

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

return interface; 
+0

或者只是不要使用私有'index'变量,而是'add'方法中的公共属性 – Bergi

+0

@Bergi我怀疑私有封装对于此函数的设计很重要。 – Alnitak

+0

是的,可能的。 OP需要决定他想要什么 – Bergi

1

的Javascript总是按值传递除了当一个变量指的是一个对象。所以,你的CURRENT_INDEX的初始化只是得到指数的初始值,而不是永久指向变量,这样初始化后,两个变量都在他们分开的方式,因此增加指数不增加CURRENT_INDEX