2011-05-10 55 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); 
    } 
}