在这个JS片段中,我有一个具有两个版本的私有函数(bar和bar2)的对象。我声明了两个实例,但是我发现私有函数(bar)的一个版本似乎错误地访问了OTHER对象中私有var v的值。有人可以告诉我为什么会这样吗?
Eric = function(_v)
{
var v = _v;
bar = function() {
alert(v);
};
function bar2() {
alert(v);
};
this.foo = function() {
bar();
};
this.foo2 = function() {
bar2();
};
};
var e = new Eric('I am Eric');
var e2 = new Eric('I am Eric II');
e2.foo(); // outputs "I am Eric II"
e.foo(); // outputs "I am Eric II" ------ WHY?
e2.foo2(); // outputs "I am Eric II"
e.foo2(); // outputs "I am Eric"
非常感谢 安德鲁
答案 0 :(得分:5)
bar = function() {
alert(v);
};
你已bar
全球化了。这意味着bar
是您的电话e2 = new Eric("I am Eric II");
使用var bar = ...
将其设为本地修复此问题。
作为单独记录,您忘记了var Eric
。
由于构造函数参数var v
在范围内,因此您也不需要在本地声明_v
。你可以继续使用那个参数。
答案 1 :(得分:0)
这是因为正在使用第二次调用在对象上重新定义bar。如果你切换到这个它应该工作:
this.bar = function() {}
当然,这打破了你想要的私人功能。 bar
不是您的Eric实例的本地符号。