Gọi hàm với context khác
Biến this trỏ tới đối tượng gọi hàm. Khi đối tượng gọi hàm thay đổi (hay context thay đổi) thì biến this sẽ nhận giá trị khác.
Ví dụ gọi đối tượng với hàm bình thường như sau:
|
|
Bây giờ hãy thay đổi con trỏ this của hàm sayHi() trỏ tới đối tượng khác.
|
|
Để ý lúc này đối tượng userPeter đã mượn hàm sayHi của userJohn và thực thi hàm này với context mới. Nên lúc này con trỏ this cũng thay đổi theo.
Thay đổi context theo ý muốn
Giờ nếu muốn userPeter.hi() in ra Chào, John! thì làm thế nào. Cách đầu tiên là thay đổi context theo ý muốn với hàm bind.
|
|
Cách khác nữa là gọi hàm sayHi với context là userJohn.
|
|
Tham số của hàm bind
Hàm bind ngoài gán context vào hàm, thì còn có thể gán tham số vào hàm.
Ví dụ sau định nghĩa hàm tích, và hàm gấp đôi một số.
|
|
Hàm call
Hàm bind sẽ gán context vào hàm và không thực thi hàm. Còn hàm call thì gán context và thực thi hàm. Tham số đầu tiên của hàm call là context mới, các tham số tiếp theo là các tham số khi gọi hàm.
|
|
Hàm apply
Hàm apply tương tự hàm call, đó là bind context mới vào hàm, và thực thi hàm. Tuy nhiên các tham số ở dưới dạng một mảng (hoặc giống mảng). Hàm apply hay dùng trong các hàm viết sẵn của Javascript.
Ví dụ hàm push sẽ thêm các phần tử vào cuối array.
|
|
Nếu muốn một mảng nối thêm các phần tử của một mảng khác thì làm thế nào. Hàm concat trả về một mảng mới nên không phù hợp. Trong trường hợp này, chúng ta có thể sử dụng với hàm push và hàm apply. Hàm apply lúc này sẽ biến hàm push từ nhận danh sách tham số thành nhận một mảng là tham số.
|
|
Ví dụ tiếp theo ở hàm tính giá trị lớn nhất. Hàm Math.max tính các giá trị lớn nhất của các tham số.
|
|
Nếu muốn tính giá trị lớn nhất của mảng, thay vì viết vòng for chúng ta hãy sử dụng hàm Math.max và hàm apply.
|
|
Nhưng cẩn thận với hàm apply khi sử dụng mảng với quá nhiều phần tử, vì chúng sẽ được chuyển sang danh sách tham số. Khi danh sách tham số của hàm quá lớn, chương trình sẽ báo lỗi. Giới hạn số lượng tham số hàm của Webkit Javascript Engine là 65536. Vì khả năng xảy ra lỗi nên chúng ta thường sử dụng hàm apply với ngoại lệ sử dụng try-catch.