Các hàm mũi tên không được thiết kế để sử dụng trong mọi tình huống chỉ đơn thuần là một phiên bản ngắn hơn của các hàm kiểu cũ. Chúng không nhằm thay thế cú pháp hàm bằng function
từ khóa. Trường hợp sử dụng phổ biến nhất cho các hàm mũi tên là "lambdas" ngắn không xác định lại this
, thường được sử dụng khi chuyển một hàm dưới dạng gọi lại cho một số hàm.
Không thể sử dụng các hàm mũi tên để viết các phương thức đối tượng bởi vì, như bạn đã tìm thấy, vì các hàm mũi tên đóng trên this
ngữ cảnh bao quanh từ vựng, this
bên trong mũi tên là hàm hiện tại mà bạn đã xác định đối tượng. Đó là để nói:
var chopper = {
owner: 'Zed',
getOwner: () => {
return this.owner;
}
};
Trong trường hợp của bạn, muốn viết một phương thức trên một đối tượng, bạn chỉ nên sử dụng function
cú pháp truyền thống hoặc cú pháp phương thức được giới thiệu trong ES6:
var chopper = {
owner: 'Zed',
getOwner: function() {
return this.owner;
}
};
var chopper = {
owner: 'Zed',
getOwner() {
return this.owner;
}
};
(Có những khác biệt nhỏ giữa chúng, nhưng chúng chỉ quan trọng nếu bạn sử dụng super
trong getOwner
đó, bạn không sử dụng hoặc nếu bạn sao chép getOwner
sang một đối tượng khác.)
Đã có một số cuộc tranh luận trên danh sách gửi thư es6 về một sự thay đổi trong các hàm mũi tên có cú pháp tương tự nhưng với cú pháp riêng của chúng this
. Tuy nhiên, đề xuất này không được đón nhận nhiều vì đó chỉ là cú pháp cú pháp, cho phép mọi người tiết kiệm việc nhập một vài ký tự và không cung cấp chức năng mới so với cú pháp hàm hiện có. Xem các chức năng mũi tên không liên kết chủ đề .
this
khác nhau. Nó được xác định bởi môi trường từ vựng nơi hàm được tạo, có nghĩa làthis
giá trị mà bạn tạochopper
biến sẽ làthis
giá trị của hàm. Nói cách khác, nó sẽ không tham chiếu đếnchopper
đối tượng.