2016-04-10 27 views
0

ES2015 ile Babel kullanıyorum. Ve iç yöntemde callback içinde this kullanmak istiyorum. bildiğim kadarıyla anladığım kadarıyla bu x() yılında geri arama işlevi ifade eder çünküES6'daki "geri aramalar" içindeki "bu" sınıfı nasıl kullanılır?

class baz { 
    bar = "xxx"; 
    foo() { 
    x(function() { 
     console.log(this.bar); 
    }); 
    } 
} 

function x(callback) { 
    return callback(); 
} 
var y = new baz(); 
y.foo(); 

https://jsfiddle.net/dnthehnt/7/ Ben

TypeError: this is undefined

alıyorum. Bir çözüm olarak ben

class baz { 
    bar = "xxx"; 
    foo() { 
    var bar = this.bar;//<===== 
    x(function() { 
     console.log(bar);//<===== 
    }); 
    } 
} 

function x(callback) { 
    return callback(); 
} 
var y = new baz(); 
y.foo(); 

https://jsfiddle.net/dnthehnt/6/ kullanmak Ve bu çözüm

xxx

olsun, ama bunu çok kafa karıştırıcı ve yazmak zor olmaya başladı kod kütlesini varsa. this'u kullanmanın daha iyi bir çözümü var mı? Ya da geri aramaları kullanmak için ES6'ya ait başka bir disiplin ve bu.

+1

Bu geçerli değil ES2015. İkinci satırdaki gibi geçersiz ('bar =" xxx ";'). A) Bu kodu 'constructor() {/*...*/}' ve B) 'ye koymak için 'this' kelimesini' bar'ın önünde kullanmak. –

+0

Sanırım '' '' yapıcı'' yerine koymak gerekli değildir. Başlatmada eklenecek kurucu değişkenleri koymak daha iyi olacağını düşünüyorum. – Shekspir

+2

Bu, "düşünme" nin bir yolu değil. Bu kod geçerli ES2015 kodu değil. Örnek alanların bu şekilde tanımlanmasına izin vermek için [Aşama 1 teklifi] (https://github.com/jeffmo/es-class-fields-and-static-properties) vardır, ancak bu sadece 1. Aşamadır (aşamalar vardır 0 ila 4, burada 4 "sonraki spesifikasyona dahil olmaya hazır"). ES2016 spesifikasyonunu engellemedi ve daha hızlı ilerlemediği sürece ES2017 için iffy görünmüyordu. Babil onu iletebilirken (Babel standart dışı birçok özelliğe sahiptir), sözdizimi, standart dışı bir kodla sizi bırakmadan önce belirtime göre değişebilir. –

cevap

7

Ok işlevlerine, özellikle de this yoluna, klasik işlevlerle karşılaştırıldığında ok işlevleriyle bakın. çubuk x çağrısına ve geri aramayı çağrısı arasında değiştirilmişse işe yaramaz klasik işlevleri kullanarak

class baz { 
    constructor() { this.bar = "xxx"; } 
    foo() { 
    x(() => { 
     console.log(this.bar); 
    }); 
    } 
} 

Sizin çözüm.

Bu

Eğer klasik fonksiyonlarının

class baz { 
    constructor() { this.bar = "xxx"; } 
    foo() { 
    const self = this; 
    x(function() { 
     console.log(self.bar); 
    }); 
    } 
} 

Yoksa bind kullanabilirsiniz ile bunu nasıl olduğunu, herhalde.

class baz { 
    constructor() { this.bar = "xxx"; } 
    foo() { 
    x((function() { 
     console.log(this.bar); 
    }).bind(this)); 
    } 
} 
+0

Oh, teşekkürler, haklısınız.() => {} Hiçbir prototipi olmadığını unuttum. – Shekspir

+3

@Shekspir: Prototiplerle hiçbir ilgisi yok. Ok işlevlerinin 'bu' bağlaması yoktur, bu yüzden onu oluşturuldukları bağlamdan miras alırlar. –

+0

Oh, bilgi için teşekkürler. – Shekspir

İlgili konular