Javascript самовыполняющиеся функции и область видимости переменных

Может ли кто-нибудь объяснить мне это поведение?

var obj = function()
{
    var _bar = 10;
    function i_bar(){return ++_bar;}

    return {
        bar  : _bar,
        i_bar: i_bar
    }
}();

obj.bar     // prints 10, OK
obj.i_bar() // prints 11, OK
obj.bar = 0 // prints 0,  OK
obj.i_bar() // prints 12, NOK

Поскольку единственная переменная _barне должен последний obj.i_bar() напечатал 1 вместо 12?

1 ответ

Решение

Ваш bar это не те же ссылки, что и i_bar ссылается. Типы значений не по ссылке, поэтому вы копируете bar в возвращаемый объект, но это не bar что ваша функция имеет в виду. Попробуй это:

var obj = function()
{
    var self = this;

    function i_bar(){return ++self.bar;}

    self.bar = 10;
    self.i_bar = i_bar;

    return self;
}();
Другие вопросы по тегам