2015-04-14 10 views
9

, ben 'bu' referans kullanarak bir sorun var kullanarak çağrı işlevi nasıl'bu' forEach döngü içinde aşağıdaki nesnesinde

function SampleObject(){ 
    this.addObject = function(object){...} 
    ... 
    // more code here 
    ... 
    this.addNewObjects= function(arr){ 
     arr.forEach(function (obj) { 
      this.addObject(new Obj(obj.prop1, obj.prop2)); 
     }); 
    } 
} 

Ben bağlamını farz ediyorum değişen ve yani 'bu' yinelenen 'obj' anlamına gelir ve 'SampleObject' değil. Problemi normal bir döngü kullanarak çözdüm, ancak bunun neden işe yaramayacağına inanıyorum ve bunu yapmak için başka bir yol olup olmadığını bilmek istiyorum.

+0

'SampleObject()' öğesini nerede/nasıl ararsınız? – Danny

+1

Bunu şu şekilde okumanızı öneririm: [burada] (http://toddmotto.com/understanding-the-this-keyword-in-javascript/) veya [here] (http://javascriptissexy.com/ anlamak-javascripts-ile-açıklık-ve-master-it /) – javinor

+0

@javinor teşekkürler, bu makaleler çok yardımcı oldular. İşlev kapsam oluşturur ve bu nedenle 'bu', varsayılan olarak 'this' sahibi olan Window nesnesine aittir. – user3339411

cevap

33

Sen değişkende bu saklayabilirsiniz:

var self = this; 
this.addNewObjects= function(arr){ 
    arr.forEach(function (obj) { 
     self.addObject(new Obj(obj.prop1, obj.prop2)); 
    }); 
} 

veya kullanım bağlama:

this.addNewObjects= function(arr){ 
    arr.forEach(function (obj) { 
     this.addObject(new Obj(obj.prop1, obj.prop2)); 
    }.bind(this)); 
} 

Ve yan not, bu this pencere object obj değil olacak olmadan. This her zaman, normal işleviyse yeni anahtar sözcük veya pencere nesnesi kullanılarak oluşturulan nesnedir. Bu durumda, sıkı modda this tanımsız olacaktır.

GÜNCELLEME: ve ES6 ile ok işlevini kullanabilirsiniz: this kendi yok

this.addNewObjects= function(arr){ 
    arr.forEach((obj) => { 
     this.addObject(new Obj(obj.prop1, obj.prop2)); 
    }); 
} 

ok fonksiyonu ve dış kapsamından olsun.

+1

İkinci çözümünüz bana çok yardımcı oldu. Teşekkürler. –