Từ khóa this
Nguyễn Dương 20-06-2024Định nghĩa this
- Biến this là một biến đặc biệt được tạo trong
mọi ngữ cảnh thực thi (Execution Context) và cho mọi function nào.
- This trỏ tới giá trị của chủ sở hữu của hàm
nơi mà this được gọi.
- This không phải static, nó phụ thuộc vào cách
mà hàm được gọi - giá trị của this chỉ được gán khi hàm thực sự được gọi.
Sử dụng this trong các
hàm
Có 4 kiểu hàm:
- Hàm là một phương thức của một đối tượng: Khi
gọi this thì giá trị của this sẽ trỏ đến đối tượng mà phương thức của đối tượng
đó được gọi.
- Hàm là một function bình thường, không gắn với
một object, khi gọi this sẽ trả về undefined đối với strict-mode. Nếu không đặt
trong chế độ strict-mode, this sẽ trả về global object trong trình duyệt là đối
tượng window.
- Hàm là một arrow function (lexical this). Biến
this sẽ có giá trị là giá trị của hàm bao bên ngoài nó, hàm parent.
- Hàm là một Event Listener, từ khóa this sẽ
luôn trỏ đến phần tử DOM mà hàm xử lý được gắn vào.
Ngoài các cách gọi này còn có call, new, apply,
bind, ...
Lưu ý khi dùng từ khóa
this
- this không bao giờ trỏ đến hàm mà chúng đang
sử dụng.
- this không bao giờ trỏ đến biến môi trường
(variable environment).
So sánh hàm thông thường
và hàm mũi tên
this trong hàm mũi tên
- Biến this trong hàm mũi tên không trỏ đến đối
tượng gọi nó mà nhận những giá trị từ hàm bao ngoài.
- Không nhầm lẫn giữa khai báo object với một
block scope.
- Biến this ở global object luôn là window
object.
Tại sao không nên sử dụng
var
- Các biến được khai báo var sẽ tạo ra các thuộc
tính trên global object.
Không sử dụng hàm mũi tên để khai báo phương thức
(chỉ sử dụng hàm thông thường)
Hàm ở bên trong phương thức
- Hàm ở bên trong một phương thức không thể
truy cập vào biến this của phương thức đó mà trả về undefine.
- Để sử dụng được this trong trường hợp này có
2 cách:
1. Tạo một biến const self = this, và sử dụng
hàm self.
2. Sử dụng hàm mũi tên.
Từ khóa arguments (đối
số)
- Từ khóa arguments chỉ có sẵn trong các hàm thông
thường, không có trong hàm mũi tên.
- Nó là một mảng trỏ đến các đối số truyền vào
hàm.
- Có thể truyền nhiều tham số hơn số lượng các tham số được đặt tên, tất cả các đối số đều được hiển thị trong mảng arguments.
function
sum (a,
b) {
console.log(arguments);
return
a +
b;
}
sum(5,
6);
sum(1,
2, 3,
4, 5);