Hàm có thể được gọi bởi:
- Các sự kiện (như click khi nhấn một button)
- Một lệnh hay khối lệnh JavaScript
- Tự động
Lưu ý trong tiếng Anh, có một vài từ dùng cho việc gọi hàm như call a function, invoke a function, execute a function. Tuy nhiên, trong JavaScript thường dùng từ invoke (hay invocation nếu là danh từ) vì ngụ ý rằng hàm có thể tự động thực thi mà không cần gọi (ví dụ hàm constructor sẽ tự động thực thi khi một function object được tạo).
Trong gọi hàm, có hai thành phần quan trọng là từ khoá this và các đối số (arguments). This được hiểu tuỳ theo cách gọi một hàm. Có 4 cách gọi một hàm là gọi hàm như một phương thức, gọi hàm như một hàm, gọi hàm bằng hàm constructor và gọi hàm với phương thức apply và call. Một giá trị của đối số là một giá trị chúng ta sẽ gán đến tên của một tham số của một hàm; ví dụ hàm Add ở trên có hai tham số là a và b và hai giá trị đối số là 4 và 3 tương ứng:
function Add (a, b) // a, b là các tham số { return a+b; } // khi gọi Add, các tham số a, b sẽ được thay bởi các giá trị các đối số là 4, 3 alert (Add(4, 3));
Trong JavaScript, khi số giá trị các đối số và số các tham số không khớp nhau thì sẽ không báo lỗi mà sẽ xử lí một cách tự động tuỳ vào tình huống. Nếu số giá trị các đối số vượt quá số tham số thì phần dư sẽ bị lược bỏ, ví dụ:
function Add (a, b) // a, b là các tham số { return a+b; } // khi gọi Add, số 5 sẽ bị lược bỏ alert(Add(4, 3, 5));
Nếu số giá trị các đối số ít hơn số tham số thì giá trị undefined sẽ là giá trị thay thế cho giá trị các đối số bị thiếu, ví dụ:
function Add (a, b) // a, b là các tham số { return a+b; } // khi gọi Add, giá trị là NaN vì 4 + undefined = NaN alert(Add(4));
Gọi hàm như phương thức
Khi một hàm là một thành phần của một object thì hàm được gọi là phương thức (method), ví dụ phương thức fullName được định nghĩa trong đối tượng myPerson:
var myPerson = { firstName:"Ngoc", lastName: "Minh", fullName: function () { return this.firstName + " " + this.lastName; } } alert(myPerson.fullName()); // kết quả là "Ngoc Minh"
trong ví dụ trên, từ khoá this dùng để chỉ chính đối tượng myPerson. Khi gọi phương thức fullName, không có giá trị argument nào vì khi định nghĩa fullName trong myPerson không có tham số.
Gọi hàm như là hàm
Khi hàm không là một phần của đối tượng, nó được xem là một hàm. Ví dụ khai báo hàm Add và gán giá trị trả về của nó cho một biến:
function Add (a, b) // a, b là các tham số { return a+b; } var sum = Add (3, 4); alert(sum);
Lúc này this sẽ trở thành một đối tượng toàn cục (global object). Trong trình duyệt web, đối tượng toàn cục sẽ là cửa sổ trình duyệt hay đối tượng Window. Chúng ta có thể kiểm tra điều này một cách dễ dàng như ví dụ dưới đây:
function myObject () { return this; } // kết quả khi gọi hàm là [object Window] alert(myObject());
Vì this là một đối tượng toàn cục nên đôi khi dẫn tới trường hợp là một phương thức sẽ không thể dùng this trong hàm bên trong nó (inner function), ví dụ:
var ob = { x:3, y:4, add: function() { function aa() { return this.x + this.y;//this không phải là ob } return aa(); } } alert(ob.add());// kết quả là NaN
Có một giải pháp khắc phục là gán giá trị của this cho một biến và hàm trong phương thức sẽ truy cập this thông qua biến này, ví dụ trên sẽ sửa lại là:
var ob = { x:3, y:4, add: function() { var that = this; function aa() { return that.x + that.y; } return aa(); } } alert(ob.add());// kết quả là 7
Gọi hàm từ hàm constructor
Khi một hàm được gọi với từ khoá new, hàm constructor sẽ được gọi. Vì hàm là một đối tượng trong JavaScript nên hàm constructor là một đối tượng. Gọi hàm với new là tạo một đối tượng mới và đối tượng mới này thừa kế tất cả thuộc tính và phương thức của hàm constructor. Ví dụ:
function Point (x, y) { this.x = x; this.y = y; } var p1 = new Point (3, 5); alert (p1.x + ", " + p1.y);
Đối tượng mới được tạo ra sẽ liên kết đến tất cả các giá trị của thành viên prototype của hàm , từ khoá this sẽ trở thành đối tượng mới đó. Xem ví dụ thêm một phương thức tên add vào đối tượng Point (vì hàm là đối tượng) ở trên:
function Point (x, y) { this.x = x; this.y = y; } Point.prototype.add = function() { return this.x + this.y; } var p1 = new Point (3, 5); alert (p1.add());// 8
Gọi hàm với phương thức call và apply
Vì hàm là đối tượng nên nó cũng chứa các phương thức. Hai phương thức dùng để gọi hàm (gọi chính nó) là call và apply. Hai phương thức cùng có đối số (argument) đầu tiên là giá trị của this (đối tượng hay null) và các đối số còn lại của call cách nhau bởi dấu phẩy, trong khi các đối số còn lại của apply được tổ chức trong một mảng. Xét hai ví dụ sau dùng call và apply:
Dùng call
function Add (a, b) // a, b là các tham số { return a+b; } var ob = Add.call (ob, 3, 4); alert(ob);
Dùng apply
function Add (a, b) // a, b là các tham số { return a+b; } var arr = [3, 4]; var ob = Add.apply (ob, arr); alert(ob);
Ý kiến bài viết