JS:声明私有函数的效果不同

时间:2011-05-09 21:04:08

标签: javascript function private

在这个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"

非常感谢 安德鲁

2 个答案:

答案 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实例的本地符号。