2014-12-27 21 views
54

Sử dụng chức năng mũi tên ES6 với từ vựng this ràng buộc là rất tốt.

Tuy nhiên, tôi chạy vào một vấn đề lúc nãy sử dụng nó với một jQuery điển hình ràng buộc nhấp chuột:

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

Sử dụng một chức năng mũi tên thay vì:

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

Và sau đó $(this) được chuyển đổi sang ES5 (tự = này) loại đóng cửa.

Có phải cách để Traceur bỏ qua "$ (this)" này để liên kết từ vựng không?

+0

Nếu một trong các câu trả lời dưới đây * đã trả lời câu hỏi của bạn *, đừng quên để đánh dấu nó như là chấp nhận . Nếu không, có lẽ bạn có thể làm rõ những gì bạn cần biết? –

+0

điều này có vẻ giống như một ví dụ hoàn hảo khi không sử dụng chức năng mũi tên vì '.on()' thực sự có giá trị 'this' hữu ích cho bạn. Đối với tôi nó rõ ràng hơn nhiều với 'this' đề cập đến mục tiêu sự kiện hơn là phải vượt qua sự kiện và tìm mục tiêu theo cách thủ công. Tôi đã không chơi nhiều với các chức năng mũi tên nhưng nó có vẻ như nó sẽ được khó hiểu để đi qua lại với các chức năng vô danh. – robisrob

Trả lời

83

Điều này không liên quan gì đến Traceur và tắt thứ gì đó, đây đơn giản là cách ES6 hoạt động. Đó là chức năng cụ thể mà bạn đang yêu cầu bằng cách sử dụng => thay vì function() { }.

Nếu bạn muốn viết ES6, bạn cần phải viết ES6 mọi lúc, bạn không thể chuyển vào và ra khỏi nó trên một số mã nhất định, và bạn chắc chắn không thể ngăn chặn hoặc thay đổi cách hoạt động của =>. Thậm chí nếu bạn có thể, bạn chỉ cần cập nhật một số phiên bản JavaScript kỳ quái mà bạn chỉ hiểu và điều đó sẽ không bao giờ hoạt động chính xác bên ngoài Traceur được tùy chỉnh của bạn, mà chắc chắn không phải là điểm của Traceur.

Cách để giải quyết vấn đề cụ thể này không phải là để sử dụng this để đạt được quyền truy cập vào các yếu tố nhấp, nhưng thay vì sử dụng event.currentTarget:

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

jQuery cung cấp event.currentTarget đặc biệt bởi vì, ngay cả trước khi ES6, nó không phải là luôn luôn có thể cho jQuery để áp đặt một this trên hàm callback (ví dụ, nếu nó được liên kết với bối cảnh khác qua bind.

+2

Lưu ý, mặc dù nó chỉ phân tách cho các cuộc gọi '.on' được ủy quyền,' this' thực sự là 'event.currentTarget'. – loganfsmyth

+0

Câu trả lời này có ổn không? Giống như loganfsmyth, 'this' ==' event.currentTarget'. Không? –

+1

@ LéonPelletier No. 'this' và' event.currentTarget' giống nhau trừ khi 'this' bị ràng buộc với phạm vi kèm theo, giống như với hàm mũi tên ES6. – meagar

29

ràng buộc tổ chức sự kiện

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

Vòng

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

Sự kiện ràng buộc tốt hơn cho chúng tôi;) – rflmyk

4

(Đây là một câu trả lời tôi đã viết cho một phiên bản khác của câu hỏi này, trước khi tìm hiểu đó là một bản sao của câu hỏi này. Tôi nghĩ câu trả lời sẽ thu thập thông tin khá rõ ràng nên tôi quyết định thêm thông tin đó làm wiki cộng đồng, mặc dù phần lớn chỉ là một câu trả lời khác.)

Bạn không thể. Đó là một nửa điểm của các chức năng mũi tên, chúng đóng trên this thay vì có riêng của chúng được thiết lập bởi cách chúng được gọi. Đối với trường hợp sử dụng trong câu hỏi, nếu bạn muốn this đặt bởi jQuery khi gọi trình xử lý, trình xử lý sẽ cần phải là hàm function.

Nhưng nếu bạn có một lý do cho việc sử dụng một mũi tên (có lẽ bạn muốn sử dụng this cho những gì nó có nghĩa là bên ngoài vào mũi tên), bạn có thể sử dụng e.currentTarget thay vì this nếu bạn thích:

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

Các currentTarget trên đối tượng sự kiện giống như những gì jQuery đặt this khi gọi trình xử lý của bạn.

8

Trường hợp khác

Câu trả lời hàng đầu là chính xác và tôi đã bỏ phiếu.

Tuy nhiên, có một trường hợp khác:

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

thể được cố định như:

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

Không có câu trả lời được chấp nhận. Và, theo thời hạn, không bao giờ có. –

Các vấn đề liên quan