2014-12-27 34 views
54

ES6 ok işlevlerini kullanarak lexical this bağlamanız harika. ES5 dönüştürülür alır

class Game { 
    foo() { 
    this._pads.on('click',() => { 
     if (this.go) { $(this).addClass('active'); } 
    }); 
    } 
} 

Sonra $(this): yerine bir ok işlevinin kullanılması

class Game { 
    foo() { 
    self = this; 
    this._pads.on('click', function() { 
     if (self.go) { $(this).addClass('active'); } 
    }); 
    } 
} 

:

Ancak, bağlayıcı tipik jQuery tıklama ile bunu kullanarak bir an önce bir sorun koştum (self = this) tipi kapanış.

Traceur'un sözdizimi için "$ (this)" ifadesini görmezden gelmesinin bir yolu var mı?

+0

:

$('jquery-selector').each(() => { $(this).click(); }) 

olarak düzeltilmesi Could:

Ancak, başka bir durum var . Eğer değilse, belki de bilmeniz gereken başka şeyleri açıklayabilir misiniz? –

+0

bu, bir ok işlevini kullanmamanın mükemmel bir örneğidir çünkü '.on()' gerçekten de sizin için bu “değeri” vardır. Bana göre, olay hedefine atıfta bulunmaktan ve hedefi manuel olarak bulmaktan ziyade olay hedefine atıfta bulunmak “daha ​​iyidir”. Ok işlevleriyle fazla oynamadık ama anonim işlevler ile geri ve ileri gitmek için kafa karıştırıcı gibi görünüyor. – robisrob

cevap

83

Bu Traceur ile bir ilgisi yoktur ve bir şeyi kapatır, bu basitçe ES6'nın nasıl çalıştığıdır. Bu, function() { } yerine => kullanarak istediğiniz özel işlevselliktir.

ES6'yı yazmak isterseniz, ES6'yı her zaman yazmanız gerekir, bazı kod satırlarına girip giremezsiniz ve kesinlikle =>'un çalışma şeklini değiştiremez veya değiştiremezsiniz. Yapabilseniz bile, sadece Traceur'un kesinlikle bir parçası olmayan ve sizin Traceur'un kesinlikle bir parçası olmayan özelleştirilmiş Traceur'un dışında hiçbir zaman düzgün çalışmayacağınız bazı tuhaf Javascript sürümlerine sahip olursunuz. Hatta ES6 önce, her zaman değil event.currentTarget özellikle çünkü

Class Game { 
    foo(){ 
    this._pads.on('click', (event) => { 
     if(this.go) { 
     $(event.currentTarget).addClass('active'); 
     } 
    }); 
    } 
} 

jQuery sağlamaktadır:

bu özel sorunu çözmek için bir yol tıklanan elemana erişmek için this kullanmak, ancak bunun yerine event.currentTarget kullanmak değildir mümkün jQuery geri arama fonksiyonu üzerinde this (yani, bind üzerinden başka bir bağlamda bağlanmış ise.

+2

Not, yalnızca ".on" çağrıları için ayrılsa da, "bu" aslında "event.currentTarget" dır. – loganfsmyth

+0

Bu cevap tamam mı? Loganfsmyth'in de belirttiği gibi 'this' ==' event.currentTarget'. Yok hayır? –

+1

@ LéonPelletier No. 'this' ve' event.currentTarget', 'bu' bir ES6 ok işlevinde olduğu gibi ekteki kapsamla sınırlı değilse aynıdır. – meagar

29

bağlanma olay

empoze etmek için
$button.on('click', (e) => { 
    var $this = $(e.currentTarget); 
    // ... deal with $this 
}); 

Döngü

Array.prototype.forEach.call($items, (el, index, obj) => { 
    var $this = $(el); 
    // ... deal with $this 
}); 
+0

Etkinlik bağlama bizim için daha iyidir;) – rflmyk

4

(Bu bu sorunun bir kopyası olduğunu öğrenme olmadan önce bu soruya başka bir versiyonu için yazdığı bir cevaptır. Bence cevap oldukça açık bir şekilde bilgileri bir araya getiriyor, bu yüzden bir topluluk vikisi olarak eklememeye karar verdim, ancak diğer cevapların sadece farklı bir ifadesi olmasına rağmen.

Yapamazsınız. Bu, ok işlevlerinin yarısıdır, aradıklarına göre ayarlanmak yerine this'u kapatırlar. Sorunun kullanım durumu için, işleyiciyi çağırırken jQuery tarafından ayarlanan this öğesini istiyorsanız, işleyicinin bir function işlevi olması gerekir.

Ama bir ok (belki bunu okun dışında ne anlama için this kullanmak istiyorum) kullanmak için bir sebep varsa, e.currentTarget yerine this kullanabilirsiniz isterseniz:

class Game { 
    foo(){ 
    this._pads.on('click', e => {     // Note the `e` argument 
     if(this.go) { 
     $(e.currentTarget).addClass('active');  // Using it 
     } 
    }); 
    } 
} 

currentTarget olay nesnesinde, jQuery öğesinin işleci çağırırken this ayarını yaptığıyla aynıdır.

8

Başka bir durum

üst yanıt doğrudur ve ben o kadar yüksek oyu ettik. Kabul olarak * cevap aşağıdaki yanıtları birini * Lütfen soru, işaretlemek için unutma yoksa

$('jquery-selector').each((index, element) => { 
    $(element).click(); 
}) 
+5

Kabul edilmiş bir yanıt yoktur. Ve zaman çizelgelerine göre, asla olmadı. –

İlgili konular