2012-10-18 15 views
0

我很難在JS中圍繞變量作用域。有沒有類似於下面的例子訪問使用對象工廠創建的對象的實例變量的方法?如何訪問使用Javascript中的對象工廠創建的對象範圍中的方法

function Renderer(id, options) { 
    var id = id; 
    var options = options; 

    return { 
     render: function(selector) { 
      $(selector).each(function(index) { 
       this.renderOptions(); //This does not reference the Renderer, but the html element selected by jQuery. 
      }); 
     }, 
     renderOptions: function() { 
      console.log(this.options); 
     } 
    } 
} 

var myRenderer = new Renderer('test', [1, 2, 3, 5, 8, 13]); 
+0

您要訪問的ID和來自對象內部實例的選項? –

+0

是的......最好我會在對象內部添加每個方法和變量的前綴以使其範圍更加明顯。 –

+0

看到這個問題:http://stackoverflow.com/questions/10595888/best-practice-to-passing-context-to-callback-function –

回答

1

你只需要保持一個命名引用您的對象,如this被重新定義的每一個方法調用,通常是指向內回調錯誤的上下文:

var instance = { 
    render: function(selector) { 
     $(selector).each(function(index) { 
      instance.renderOptions(); 
     }); 
    }, 
    ... 
} 
return instance; 
0

修改後的代碼

function Renderer(id, options) { 
    var id = id; 
    var options = options; 

    return { 
     render: function(selector) { 
      var self = this; 
      $(selector).each(function(index) { 
       self.renderOptions(); // here this is a reference of dom element. 
      }); 
     }, 
     renderOptions: function() { 
      console.log(this.options); 
     } 
    } 
} 
0

由於var options...Renderer的範圍內,您可以簡單地使用options裏面的renderOptions功能。

您還需要創建一個對this的引用,如其他海報所述。

function Renderer(id, options) { 
    var id = id; 
    var options = options; 

    return { 
     render: function(selector) { 
      var self = this; 
      $(selector).each(function(index) { 
       self.renderOptions(); 
      }); 
     }, 
     renderOptions: function() { 
      console.log(options); 
     } 
    } 
} 

而且,如果我正確地讀這段代碼的意圖,你可能會想對元素的引用傳遞到renderOptions功能:

function Renderer(id, options) { 
    var id = id; 
    var options = options; 

    return { 
     render: function(selector) { 
      var self = this; 
      $(selector).each(function(index) { 
       self.renderOptions(this); 
      }); 
     }, 
     renderOptions: function(ele) { 
      $(ele).css(options); // or whatever you plan to do. 
     } 
    } 
} 
相關問題