Parameters và Arguments trong hàm

Javascript là một ngôn ngữ lập trình thông dịch ( functional language ), điều đó có nghĩa rằng hàm (function)  là đơn vị cơ bản nhất mỗi khi thực thi chương trình . Các hàm rõ ràng là rất quan trọng trong Javascript. Khi nói về hàm, các thuật ngữ parameters  (tham số)  và arguments  (đối số) thường được sử dụng để thay thế cho nhau như thể nó đều đề cập đến một thứ giống nhau, nhưng có một sự khác biệt nhỏ mà tinh tế ở đây.

  • Parameters (tham số) là danh sách các biến được liệt kê trong lúc định nghĩa hàm.
  • Arguments (đối số) là giá trị thực của biến truyền vào hàm mỗi khi hàm được gọi.

Có 1 điều đặc biệt ở đây là JavaScript sẽ không xuất hiện lỗi nếu số lượng Arguments được truyền vào trong lúc gọi hàm khác với số lượng Parameters lúc định nghĩa hàm. Điều này có thể giải thích là do ArgumentsParameters được chương trình coi như là hai thực thể khác biệt nhau.

// Hàm argCheck với 3 tham số và xuất ra tổng các tham số
function argCheck(parameter1, parameter2, parameter3){
  console.log(parameter1 + parameter2 + parameter3);
}

// Hàm argCheck được gọi với 4 đối số
argCheck(1,2,3,4);
// Xuất ra 6 (1 + 2 + 3, bỏ qua 4)

// Hàm argCheck được gọi với 2 đối số
argCheck(1,2);
// Xuất ra NaN, bởi vì theo mặc định parameter3 không được cung cấp
// sẽ được chương trình gán giá trị undefined.
// Vì vậy 1+2+undefined = NaN

// Chú ý, không có lỗi xuất hiện

Trong đoạn code trên, hàm argCheck có 3 tham số bên trong định nghĩa hàm. Ở dòng 7, chúng ta gọi hàm argCheck với một đối số dư thừa và code vẫn thực thi mà không có bất kỳ lỗi nào. Tương tự như vậy trên dòng 11, chúng ta gọi hàm argCheck với số lượng đối số ít hơn so với số lượng tham số và chương trình vẫn không xuất hiện bất kỳ lỗi nào.

Hy vọng ví dụ trên đã giúp bạn phân biệt được 2 khải niệm parametersarguments. Phần sau bài viết này chúng ta sẽ cùng thảo luận về một số tính năng mà JavaScript cung cấp để xử lý parametersarguments.

The arguments parameter

Bạn khoan hiểu nhầm, ở đây ko phải chơi chữ. Giống như từ khóa this, trong mỗi hàm đều có thêm 1 từ khóa nữa gọi là arguments. Nó là 1 biến địa phương (local), được phép truy cập bên trong tất cả các hàm và chứa toàn bộ các arguments truyền vào hàm. Đối tượng arguments thực tế là 1 mảng, và mảng này có thể được sử dụng để truy cập đến các arguments truyền vào hàm.

function argumentVar(parameter1, parameter2, parameter3){
  console.log(arguments.length); // Xuất ra số lượng đối số được truyền vào.
  console.log(arguments[3]); // Xuất ra giá trị đối số thứ 4 của đối tượng argument.
}

argumentVar(1,2,3,4,5);
// Kết quả:
// 5
// 4

// 5 là số lượng đối số được truyền vào hàm argumentVar
// 4 là giá trị đối số thứ 4 của đối tượng argument

Hãy xem đoạn code trên về cách đối tượng arguments được sử dụng . arguments.length chỉ định chính xác số lượng arguments truyền vào hàm mà ko phụ thuộc vào số lượng parameters bên trong hàm định nghĩa.

Rest Parameters

Rest Paramters là phần bổ sung ES6 cho Javascript. Để tạo ra một Rest Paramters, ta cần sử dụng tiền tố “ … “ ( 3 dấu . ) đằng trước parameter.

function restParam(...restArgs){
  console.log(restArgs.length); // Xuất ra số lượng đối số được truyền vào hàm
  console.log(restArgs[3]); // Xuất ra đối số thứ 4
}

restParam(1,2,3,4,5);
// Kết quả:
// 5
// 4

// 5 là số lượng đối số được truyền vào hàm argumentVar.
// 4 là giá trị đối số thứ 4.

Ở đoạn code trên, …restArgs đã tạo ra 1 mảng có tên là restArgs. Mảng restArgs này sẽ giữ tất cả arguments vào trong chính bản thân nó.

2 điểm khác biệt chính giữa argumentsrest parameter:

Bản chất của Rest Parameter thực tế là 1 mảng, và chính vì là 1 mảng, nó có sử dụng được các phương thức như forEach sort. Trong khi đó, dù đối tượng argumentssử dụng được phương thức length như trong ví dụ trên thì thực chất nó cũng không hẳn là 1 mảng. Nếu chúng ta sử dụng các phương thức như sort cho arguments, điều này sẽ phát sinh lỗi.

Rest Parameter có thể sẽ không chứa hết các arguments được truyền vào hàm, trong khi đối tượng arguments chứa tất cả các arguments đó. Đoạn mã ví dụ như sau:

function restParam(parameter1, ...restArgs){
  console.log(restArgs.length); 
// Xuất ra số lượng đối số được gán tới mảng restArgs console.log(restArgs[3]);
// Xuất ra giá trị của đối số thứ 4 nằm trong mảng restArgs. } restParam(1,2,3,4,5); // Kết quả: // 4 // 5
// parameter1 có giá trị là 1
// restArgs là mảng có 4 phần tử bao gồm [2,3,4,5]

Hy vọng bài viết này đã cung cấp cho bạn một số thông tin hữu ích về argumentsparameters và cách phân biệt giữa hai định nghĩa quan trọng này. Hẹn gặp lại bạn trong các bài sau của mình.

Link tham khảo: Nhấp vào đây

LEAVE A REPLY

Please enter your comment!
Please enter your name here