JS: Разница в том, как объявляются частные функции - PullRequest
1 голос
/ 10 мая 2011

В этом фрагменте JS у меня есть объект с двумя версиями приватной функции (bar и bar2).Я объявляю два случая, но я был пойман тем фактом, что одна версия закрытой функции (bar), по-видимому, неправильно обращается к значению приватной переменной v v в объекте OTHER.Кто-нибудь, пожалуйста, скажите мне, почему это?

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 ]

5 голосов
/ 10 мая 2011
bar = function() {
    alert(v);
};

Вы сделали bar глобальным. Это означает, что bar является второй функцией бара, определенной в вашем вызове e2 = new Eric("I am Eric II");

Исправьте это, используя var bar = ..., чтобы сделать его локальным.

В качестве отдельной заметки вы забыли var Eric.

Вам также не нужно локально объявлять var v, поскольку аргумент конструктора _v находится в области видимости. Вместо этого вы можете просто продолжать использовать этот аргумент.

0 голосов
/ 10 мая 2011

Это потому, что bar переопределяется на объекте со вторым вызовом.Если вы переключились на это, оно должно работать:

this.bar = function() {}

Конечно, это нарушает частную функцию, которую вы хотите.bar не является локальным символом только для вашего экземпляра Эрика.

...