2010-08-28 25 views
11

Bir nesne yönteminde, javascript satır içi işlevinden "bu" ifadesine başvurmakta zorluk çekiyorum.Bir nesnenin satır içi işlevinden buna erişme

var testObject = { 
    oThis : this, 
    testVariable : "somestring", 
    init : function(){ 

     console.log(this.testVariable); // outputs testVariable as expected 

     this.testObject.submit(function(){ 

      var anotherThis = this; 
      console.log(this.testVariable) // undefined 
      console.log(oThis.testVariable) // undefined 
      console.log(testObject.testVariable) // outputs testVariable 
      console.log(anotherThis.testVariable) // undefined 

    } 

} 

nasıl gönderebilirim işlev içinde this.testVariable erişirim? Ayrıca jQuery de kullanıyorum, bu bir fark yaratırsa. Bu iyi yaklaşım ise

acaba - ve belki daha sonra ayrı bir fonksiyon olarak göndermesini ve gerektiği satır içi başvuru gibi:

init : function(){ 

    this.testObject.submit = this.submitForm; 

}, 
submitForm : function(){ 
    // do validation here 
    console.log(this.testVariable) // outputs testvariable 

    . 
    . 
    . 

    return valid; 
} 

Ama bu işe ya görünmüyordu - ve Şimdilik şimdilik benim init yöntemimde gönderme işlevini satır içi tutmak istiyorum.

+0

olası kopyası [Neden bu kapanış 'bu' anahtar sözcüğe erişemiyor? - jQuery] (http://stackoverflow.com/questions/3323189/why-doesnt-this-closure-have-access-to-the-this-keyword-jquery) –

cevap

30

Yerel bir değişkene this adresini atamak yaygın bir yoldur. bir işlev — herhangi fonksiyonu olursa olsun — tanımlanmış yerin denir dinamik zaman

init: function() { 
    var _this = this; 
    this.testObject.submit(function() { 
     console.log(_this.testVariable); // outputs testVariable 
    }); 
} 
+1

Oh "Bu" atama init içinde İşlev - elbette ... lanet olsun! Yapmaya çalıştığım buydu, ancak bunun yerine anonim işlev içinde atamak yerine ... Yardımlarınız için teşekkürler! – Matt

+0

Şimdi dünyanın en aptal insanı gibi hissediyorum - / – kurumkan

0

"Bu" değişken bağlıdır.

Bu "gönderme" işlevinin ne yapması gerektiğini veya nerede kullanılması gerektiği görmeden, nasıl değiştirileceğini söylemek zor. Yapabileceğin bir şey sizin "init" fonksiyonunda "Gönder" tanımlamaktır: "Bu" sizin nesnelerden birinin örneğine ayarlanmadı ile başlangıçta denir

init: function() { 
    // whatever 
    var instance = this; 
    instance.submitForm = function() { 
    console.log(instance.testVariable); 
    // ... 
    }; 
} 

sürece "init" olarak, şunları yapmalısınız iyi ol.

0

Bu değişkene yalnızca başka bir işlevin içinde olduğunuz için kaybedilen nesne bağlamından erişebilirsiniz. veya yeni bir nesneyi örnekleyerek.

testInstance.oThis; 

ama

bu Matt gibi bir şey denemek olacağını gereksiz olurdu: Bu

var testInstance = new testObject(); 

gibi Sonra kullanarak othis erişebilecek

init: function(){ 

var self = this; // this allows you to access the parent object from different contexts 

this.testObject.submit(function(){ 

    console.log(self.testVariable); 

} 
5

Yapabilirsin ayrıca ES6 ok işlevlerini kullanarak bunu yapın:

init: function(){ 
    this.testObject.submit(() => { 
     console.log(this.testVariable); 
    } 
} 

Ok fonksiyonları yeni bir değişken için this atamak için, veya bağlı fonksiyonları kullanımı ihtiyacını ortadan kaldırmak parça bağlam this değerini yakalamak.