This trong Javascript.
Một điều buồn cười là cả thế giới dever JS chưa chốt với nhau được cách dùng this. Dùng thế nào cho đúng, dùng thế nào cho tiện, dùng thế nào cho tránh bug...và giảng giải làm sao cho người mới tìm hiểu. Cái nôi của JS là Mozilla thì định nghĩa this theo kiểu context (ngữ cảnh), kiểu như là "à this à, function khởi tạo chứa this rồi thì function ấy được gọi ra sử dụng trong context nào thì this lúc ấy nó tham chiếu đến các object của context ấy".
Chung chung đại ý là thế, ai chế ra thế nào thì dùng chứ chúng tôi (Mozilla) không khuyến khích các bạn dever phải làm thế này với this, phải dùng thế kia với this
. Các bạn định nghĩa "window.self = this" rồi dùng this như self cũng được luôn.
Chính sự lộn xộn ấy mà đến ES6 ra thêm cái gọi là arrow function (hàm mũi tên) ngoài rút gọn cách khai báo function ra thì nó hạn chế cách dùng bừa phứa của "this" đi nhưng cũng không thể nào hoãn lại cái cách mà người ta (các coder) "this" lung tung được.
Còn với tôi thì dùng this bám theo cách mà Mozilla định nghĩa this: This tham chiếu đến đối tượng trong context mà hàm chứa nó được gọi ra. This khi trong hàm khởi tạo, thì bản thân this là một object rỗng.
Đây đây bạn xem hình dưới đây.
Chú ý: bạn phải phân biệt hàm khởi tạo ra this và hàm chứa this được gọi ra. Chúng nằm ở hai context khác nhau.
Như ví dụ trên, hàm speak được gọi ra trong context chứa object greetMe nên this tham chiếu đến các phương thức, thuộc tính của greetMe.
Ở Context chứa function khởi tạo ra this: This là
object rỗng và this chỉ đơn giản ngầm là trỏ đến một đối tượng nào đấy, mà đối tượng nào thì this
sẽ chờ xem hàm chứa this, nó được
gọi ra dùng trong context nào và context ấy lại đang chứa những đối tượng nào đang có liên quan với this thì this tham chiếu đến đối tượng ấy.
Ở Context hàm chứa this được gọi ra: Thì this lúc này bắt đầu tham chiếu đến đối tượng mà có liên quan đến nó, có ràng buộc với nó. Việc tham chiếu this vào obj kiểu bị động này là do Trình thông dịch JS check xem
hàm chứa this đang được "gọi ra" trong context nào để trỏ this vào obj liên quan. Bởi vì
bị động tham chiếu như vậy nên khi làm việc với "this" bạn cần phải biết mình đang muốn trình thông dịch nó trỏ this đi đâu.
Từ ý nghĩa này mà this được ứng dụng trong
hàm constructor để tạo ra new instant object. Bạn sẽ gặp rất nhiều khi code JS.
Tạm thế đã, khuya rồi. Mình gọi bài này là "This cơ bản" trong JS nhé, sẽ có phần 2. gọi là "this" nâng cao :d