Tham số (Parameter) và đối số (Argument) của hàm JavaScript
– Ở bài viết Tổng quan về hàm trong JavaScript, chúng ta đã biết rằng hàm có thể có các tham số (parameters):
functionName(parameter1, parameter2, parameter3) { // các lệnh thực thi }
– Các tham số của hàm (function parameters) là các tên (names) được liệt kê trong định nghĩa hàm.
– Các đối số của hàm (function arguments) là các giá trị thực (real values) truyền vào cho hàm, hay giá trị mà hàm được nhận.
1. Tham số của hàm (function parameter)
– Một hàm có thể có một hoặc nhiều tham số và chúng được sử dụng bên trong hàm.
– Một hàm JavaScript là một ngôn ngữ kịch bản kiểu động, vì vậy một tham số hàm có thể có giá trị của bất kỳ kiểu dữ liệu nào. Khi định nghĩa hàm JavaScript không chỉ định kiểu dữ liệu của tham số.
Ví dụ:
[code language=”javascript”]function showMessage(parameter1, parameter2) {alert("Hello " + parameter1 + " " + parameter2 + "!");
}
showMessage("Minh", "Hoàng"); // Hello Minh Hoàng!
showMessage(100, 99.99); // Hello 100 99.99!
showMessage(true, "2018/10/20"); // Hello true 2018/10/20![/code]
Try it »
– Các hàm JavaScript không thực hiện kiểm tra kiểu của các đối số đã truyền (passed arguments).
– Các hàm JavaScript không kiểm tra số lượng đối số nhận được.
– Bạn có thể truyền ít hơn hoặc nhiều hơn số đối số khi gọi một hàm:
- Nếu ít đối số hơn được truyền, các tham số còn lại sẽ undefined.
- Nếu nhiều đối số hơn được truyền, các đối số bổ sung sẽ bị bỏ qua.
Ví dụ:
[code language=”javascript”]function showMessage(parameter1, parameter2) {alert("Hello " + parameter1 + " " + parameter2 + "!");
}
showMessage("Minh", "Hoàng", "Mr."); // Hello Minh Hoàng!
showMessage(100); // Hello 100 undefined!
showMessage(); // Hello undefined undefined![/code]
Try it »
■ Parameter Defaults
– Nếu một hàm được gọi với các đối số bị thiếu (missing arguments – ít hơn số lượng được khai báo), thì các giá trị bị thiếu được đặt thành: undefined.
– Đôi khi điều này có thể chấp nhận được, nhưng trong một số trường hợp, cách làm tốt hơn là gán một giá trị mặc định (default value) cho tham số:
Ví dụ:
[code language=”javascript”]function myFunction(x, y) {if (y === undefined) {
y = 0;
}
return x * y;
}
myFunction(4); // return 0[/code] Try it »
ECMAScript 2015 cho phép các tham số có giá trị mặc định khi gọi hàm:
[code language=”javascript”]function (a=1, b=1) { // function code }[/code]2. Đối tượng arguments
– Mặc định, các hàm JavaScript có một đối tượng dựng sẵn (built-in object) được gọi là arguments object.
– arguments object là một mảng giống như object. Bạn có thể truy cập các giá trị của nó bằng cách sử dụng chỉ mục tương tự như mảng. Tuy nhiên, nó không hỗ trợ các phương thức mảng.
Ví dụ: Arguments Object
[code language=”javascript”]function showMessage(parameter1, parameter2) {alert("Hello " + arguments[0] + " " + arguments[1] + "!");
}
showMessage("Minh", "Hoàng"); // Hello Minh Hoàng!
showMessage(100, 99.99); // Hello 100 99.99!
showMessage(true, "2018/10/20"); // Hello true 2018/10/20![/code]
Try it »
– arguments object vẫn hợp lệ ngay cả khi hàm không chứa bất kỳ tham số nào.
Ví dụ:
[code language=”javascript”]function showMessage() {alert("Hello " + arguments[0] + " " + arguments[1] + "!");
}
showMessage("Minh", "Hoàng", "Mr."); // Hello Minh Hoàng!
showMessage(100); // Hello 100 undefined![/code]
Try it »
– arguments object có thể được iterated bằng cách sử dụng vòng lặp for.
Ví dụ: Iterate all arguments
[code language=”javascript”]function showMessage() {var ii;
var len = arguments.length;
for(ii = 0; ii < len; ii++) {
alert(arguments[ii]);
}
}
showMessage("Minh", "Hoàng", "Blog");[/code] Try it »
Ví dụ: Tìm số lớn nhất của các đối số
[code language=”javascript”]function findMax() {var ii;
var len = arguments.length;
var max = -Infinity;
for(ii = 0; ii < len; ii++) {
if (arguments[ii] > max) {
max = arguments[ii];
}
}
return max;
}
findMax(1, 123, 200, 44, -88); // return 200[/code] Try it »
Ví dụ: Tính tổng của các đối số
[code language=”javascript”]function sumAll() {var ii;
var len = arguments.length;
var sum = 0;
for(ii = 0; ii < len; ii++) {
sum += arguments[ii];
}
return sum;
}
sumAll(1, 123, 200, 44, -88); // return 280[/code] Try it »
Nếu một hàm được gọi với quá nhiều đối số (nhiều hơn được khai báo), thì bạn có thể truy cập các đối số này bằng cách sử dụng arguments object.
Các đối số (arguments) được truyền như một giá trị (value) khi gọi hàm
– Các đối số (arguments) JavaScript được truyền theo giá trị (tham trị): hàm chỉ nhận biết các giá trị, không phải là vị trí của đối số (argument’s location).
– Nếu hàm thay đổi giá trị của đối số, giá trị ban đầu của tham số sẽ không bị thay đổi. Tức là giá trị của đối số trước và sau khi ra khỏi hàm là giống nhau, không bị thay đổi.
Các đối tượng (objects) được truyền như một tham chiếu (reference) khi gọi hàm
– Trong JavaScript, đối tượng là kiểu tham chiếu.
– Nếu hàm thay đổi thuộc tính của đối tượng (object property), giá trị ban đầu sẽ bị thay đổi. Tức là việc thay đổi giá trị của các object properties bên trong hàm sẽ được phản ánh bên ngoài hàm.