Javascript: закрытие доступа к переменной члена - PullRequest
0 голосов
/ 10 мая 2011

Мне интересно, как работать с переменными-членами в замыканиях в JavaScript. Следующий код предупреждает «6».

function testy()
{
    function blah()
    {
        this.a = 5;
        this.func = function()
        {
            this.a = 6;
            alert(this.a);
        }
    }

    var x = new blah;
    x.func();
}

но этот код предупреждает 5.

function testy()
{
    function execute(func)
    {
        func();
    }

    function blah()
    {
        this.a = 5;
        this.func = function()
        {
            execute(function()
            {
                this.a = 6;
            });

            alert(this.a);
        }
    }

    var x = new blah;
    x.func();
}

Как передать закрытие, которое все еще обращается к переменным-членам включающего объекта?

Ответы [ 2 ]

1 голос
/ 10 мая 2011
execute(function()
{
   this.a = 6;
});

function execute(func)
{
    func();
}

Ваш вызов функции как func(); и по умолчанию без указания контекста this будет преобразован в глобальный контекст, который в браузере равен window. Здесь можно использовать три параметра.

make this local

var that = this;
execute(function()
{
   that.a = 6;
});

Теперь that указывает на правильный this.

привязка this область действия к функции

execute((function()
{
   this.a = 6;
}).bind(this));

Это свяжет правильную / ожидаемую область действия this с вашей функцией. Обратите внимание, что Function.prototype.bind является ES5 и сломает старые браузеры. _.bind - разумная альтернатива кросс-браузерной обработки.

редактировать, выполнить

function execute(f, context) {
    f.call(context);
}

execute(function() {
    this.a = 6;
}, this);

Передача контекста в качестве дополнительного параметра для выполнения. Затем execute вызовет Function.prototype.call, чтобы убедиться, что функция вызывается с нужным контекстом

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

Попробуйте это:

function blah()
{
    this.a = 5;
    this.func = function()
    {
        var self = this;
        execute(function()
        {
            self.a = 6;
        });
        alert(this.a);
    }
}
...