Javascript:成员变量访问闭包

时间:2011-05-10 00:42:57

标签: javascript oop closures member

我想知道如何处理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 个答案:

答案 0 :(得分:1)

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

function execute(func)
{
    func();
}

您将该函数调用为func();,默认情况下不指定上下文this将解析为浏览器中的window全局上下文。您可以使用三个选项这里。

制作this本地

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);

您将上下文作为执行的额外参数传递。然后执行将调用Function.prototype.call以确保使用所需的上下文调用该函数

答案 1 :(得分:0)

试试这个:

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