[ES6] Một hành xử lạ mà không lạ của arrow function
Javascript
314
es6
21
White

Hà Phạm viết ngày 06/11/2015

Nếu chưa biết về arrow function trong ES6, mời các bạn xem qua bài viết này

Với ý định viết một hàm hook vào chỗ trước khi save của mongoose, tôi đã sử dụng arrow function như thế này:

UserSchema.pre('save', (next) => {
  let now = new Date();
  this.updateAt = now;
  if (!this.createdAt) {
    this.createdAt = now;
  }

  next();
});

Nhưng thật không may, khi chạy lỗi bắn ầm ầm :smile:

TypeError: Cannot set property 'updateAt' of undefined

Thật kỳ quái, arrow function sinh ra để giải quyết vấn đề ngữ cảnh gọi hàm cơ mà, undefined là undefined thế quái nào nhỉ? Hừm, hãy xem xét kỹ một tí. Đoạn code trên có thể hiểu (một cách gần đúng) như thế này

var beforeSave = function(next) {

  var now = new Date();
  this.updateAt = now;
  if (!this.createdAt) {
    this.createdAt = now;
  }

  next();

}.bind(this); // (1)

UserSchema.pre('save', beforeSave);

Như vậy là ngữ cảnh (this) đã được gán từ vị trí (1) và hoàn toàn nằm ngoài context của UserSchema của chúng ta, và được máy chạy hiểu là undefined. Mà oái oăm hơn nữa là context của arrow function không thể override được. Vậy nên cũng dễ hiểu là chúng ta đã bị lạc ngay từ vị trí (1).

Vậy, kết luận, là arrow function chỉ nên được dùng làm thủ tục con trong thân của một phương thức nào đó. Hết :smile:

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Hà Phạm

25 bài viết.
72 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
45 8
Xin chào, đây là lần đầu tiên mình post bài ở đây. Nhiều vấn đề mình cũng không rành lắm, có gì sai mọi người góp ý nhé. Xin cảm ơn :D Bài này gi...
Hà Phạm viết hơn 5 năm trước
45 8
White
38 8
Lâu không post gì muốn viết một bài dài dài về js cơ mà đau đầu quá viết mãi không xong, thôi post bài ngắn vậy :smiley: Lấy screen size ở đây tôi...
Hà Phạm viết 5 năm trước
38 8
White
32 3
Đây là một trong các concept mới đối tượng mới được đưa vào ECMAScript 6. Việc sử dụng chúng rất dễ nhưng để hiểu được thì (đối với tôi) cũng cần k...
Hà Phạm viết hơn 5 năm trước
32 3
Bài viết liên quan
White
70 8
Tăng sức mạnh cho javascript với lodash Lần này mình sẽ giới thiệu 1 thư viện javascript vô cùng bá đạo có tên là "lodash]1]", có thể nói nó là LI...
Huy Hoàng Phạm viết gần 5 năm trước
70 8
White
10 1
_Có mấy chia sẻ nhỏ, mình muốn đưa ra để mọi người cùng thảo luận góp ý. Thread này không tập trung vào Technical nữa mà discuss về Coding Style & ...
Hùng Phong viết gần 2 năm trước
10 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
25 bài viết.
72 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!