Bàn về this trong JavaScript - Làm thế nào để xác định this?
Ở bài trước mình đã trình bày về this và call-site, ở bài này mình sẽ nói về cách xác định this: Đầu tiên bạn xác định call-site, tức là xem hàm được gọi ở đâu chứ không phải được khai báo ở đâu. Sau đó xem xét xem 4 luật dưới đây luật nào được áp dụng cho trường hợp của mình. 1. Default ...
Ở bài trước mình đã trình bày về this và call-site, ở bài này mình sẽ nói về cách xác định this:
- Đầu tiên bạn xác định call-site, tức là xem hàm được gọi ở đâu chứ không phải được khai báo ở đâu.
- Sau đó xem xét xem 4 luật dưới đây luật nào được áp dụng cho trường hợp của mình.
1. Default Binding: this tham chiếu tới global object
Nhớ rằng nếu trường hợp của bạn không ứng với luật nào khác, thì luật này được xài.
Xem xét đoạn code:
function foo() { console.log(this.a) } var a = 2 foo() // 2
Đầu tiên (nếu bạn chưa biết) là các biến khai báo ở global scope, như kiểu var a = 2, chính là thuộc tính của global object (điều này không đúng với NodeJS hoặc strict mode, với node thì thay vì var a = 2 ta sử dụng a = 2). Thứ hai, khi chạy code bạn sẽ thấy this.a chính là thuộc tính a của global object.
Default Binding đã được sử dụng ở đây, this trỏ tới global object.
Ờ, thế tại sao chúng ta lại biết trường hợp này là Default Binding ?
Trong đoạn code, foo() được gọi một cách thuần túy, không thông qua object, constructor, hay sử dụng một phương thức bind nào, thì Default Binding được áp dụng, có nghĩa là this trong hàm sẽ trỏ tới global object. Với strict mode, sẽ không bao giờ có Default Binding vì global object undefined, nếu không có luật nào áp dụng, this của chúng ta sẽ là undefined