2011-05-10 57 views
0

我想知道如何在JavaScript中处理闭包中的成员变量。以下代码提醒“6”。Javascript:会员变量访问闭包

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

我如何通过一个封闭仍然访问封闭对象的成员变量?

回答

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以确保与所需的环境下,该功能被称为

+0

我不会说“立刻范围来的窗口。”但它将*解析为全局对象,相当于浏览器中的'window'。在javascript中有足够的混淆而不会推断它与范围有关。 :-) – RobG 2011-05-10 00:51:43

+0

@RobG编辑删除单词'范围';) – Raynos 2011-05-10 00:54:17

+0

优秀的答案,谢谢!但是,在“绑定”示例中是否存在拼写错误(“that”而不是“this”)? – bfops 2011-05-10 10:51:02

0

试试这个:

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