Tổ chức được mã nguồn dưới dạng các đơn vị để dễ quản lí và có thể tái sử dụng được

1. Mục tiêu

  • Trình bày được khái niệm và mục đích của hàm
  • Trình bày được cú pháp khai báo hàm
  • Trình bày được cú pháp gọi hàm
  • Giải thích được tham số của hàm
  • Giải thích cách sử dụng câu lệnh return trong hàm
  • Trình bày được phạm vi của biến
  • Khai báo và sử dụng được hàm không tham số
  • Khai báo và sử dụng được hàm có tham số
  • Khai báo và sử dụng được hàm có return
  • Khai báo và sử dụng được hàm đệ quy

2. Giới thiệu

Hàm là một khái niệm quen thuộc với hầu hết mọi người, kể cả những người mới bắt đầu học lập trình, bởi vì tên gọi này đã được chúng ta biết đến trước đó trong toán học.

Hãy cùng nhớ lại một vài hàm đơn giản mà chúng ta đã từng biết đến trong toán học, chẳng hạn như:

  • f, g, h được gọi là tên hàm
  • xy được gọi là các biến số
  • x2, √𝑥 + √yf(x) + g(x,y) được gọi là các biểu thức

Chúng ta có thể đánh giá các hàm f, gh với các giá trị cụ thể của biến số. Chẳng hạn như:

Có nghĩa là:

  • Với biến x = 5 thì hàm f sẽ cho giá trị là 25
  • Với biến x = 9y = 25 thì hàm g sẽ cho giá trị là 8
  • Với biến x = 9 và y = 25 thì hàm h sẽ cho giá trị là 89

Chúng ta cũng dễ dàng nhận thấy có hai bước để làm việc với hàm đó là định nghĩa hàmsử dụng hàm.

Trong lập trình, chúng ta cũng có một khái niệm tương tự như vậy. Khái niệm này cũng được gọi là hàm, nhưng tất nhiên là chúng ta sẽ không định nghĩa hàm bằng các ký hiệu như trong toán học. Nội dung của chương này sẽ đề cập đến hàm, cách khai báo hàm và sử dụng hàm.

Hoàn thành chương này, chúng ta có thể phát triển các ứng dụng trong đó có sử dụng hàm để giảm thiểu sự trùng lặp mã nguồn và phân tách các bài toán lớn thành các bài toán nhỏ hơn để dễ giải quyết.

3. Hàm

Hàm là gì?

Hàm là một khối lệnh được sử dụng để thực hiện một công việc nhất định. Trước khi sử dụng hàm thì chúng ta cần khai báo hàm.

Ở các phần trước, chúng ta đã sử dụng một số hàm có sẵn trong JavaScript, chẳng hạn như hàm console.log(), alert(), Math.pow(), Math.random()… Để sử dụng các hàm được dựng sẵn trong JavaScript chúng ta chỉ cần gọi đến chúng với đầy đủ tham số được yêu cầu.

Lưu ý:  Đôi khi giữa các tên gọi hàm (function), phương thức (method), thủ tục (procedure) có thể dùng thay thế cho nhau nhưng về bản chất ba khái niệm này có sự khác nhau.

Ví dụ:

Hàm alert() là một hàm có sẵn của JavaScript, mục đích của hàm này là hiển thị một hộp thông báo. Đoạn mã sau hiển thị một thông báo “Hello JavaScript” bằng cách gọi hàm alert():

1.	alert("Hello JavaScript"); 

Tương tự như vậy, đoạn mã sau gọi hàm log() của đối tượng console nhằm hiển thị dòng chữ Hello JavaScript trong cửa sổ console:

1.	console.log("Hello JavaScript"); 

Các thành phần của hàm

Khi làm việc với hàm, chúng ta cần biết rõ các thành phần của hàm: tên hàm, nhiệm vụ của hàm, tham số đầu vào của hàm, giá trị trả về của hàm.

Tên hàm

Tên hàm là một định danh để đại diện cho hàm. Chúng ta sẽ cần định danh này để sử dụng được hàm. Tên của hàm cần tuân thủ quy tắc đặt tên của ngôn ngữ. Tên của hàm cũng nên là một động từ, bởi vì nó thực hiện một thao tác nào đó.

Tên không tốtTên tốtLý do
myInterestcalculateInterestBắt đầu bằng động từ
FindMaxValuefindMaxValueViết thường chữ đầu tiên
get_paymentgetPaymentSử dụng Camel Case

Nhiệm vụ của hàm

Mỗi hàm sẽ thực hiện một nhiệm vụ nhất định nào đó, do vậy, trước khi định nghĩa hàm thì chúng ta cần xác định rõ là hàm này nhằm thực hiện nhiệm vụ gì. Chẳng hạn:

  • Hàm tính bình phương của một số
  • Hàm tính luỹ thừa an
  • Hàm tính thể tích của hình trụ

Tham số đầu vào

Tham số đầu vào là các giá trị cần thiết để có thể thực hiện tính toán bên trong hàm. Chẳng hạn:

  • Hàm tính bình phương của một số sẽ cần tham số đầu vào là một số
  • Hàm tính luỹ thừa an sẽ cần tham số đầu vào là cơ số a và số mũ n
  • Hàm tính thể tích hình trụ cần tham số đầu vào là bán kính đáy và chiều cao trụ

Giá trị trả về

Sau khi thực hiện tính toán thì hàm có thể trả về một giá trị để đại diện cho kết quả thực thi. Không phải tất cả các hàm đều có giá trị trả về. Chẳng hạn:

  • Hàm tính bình phương, hàm tính luỹ thừa, hàm tính thể tích đều có giá trị trả về là một số
  • Hàm alert() không có giá trị trả về
  • Hàm confirm() có giá trị trả về là một chuỗi

Ví dụ:

1.	function sum(firstNumber, secondNumber) {
2.	   return firstNumber + secondNumber;
3.	}

Các thành phần của hàm được khai báo ở trên:

  • Tên hàm là sum
  • Nhiệm vụ của hàm là tính tổng 2 tham số được truyền vào
  • Tham số đầu vào gồm 2 số: firstNumbersecondNumber
  • Hàm trả về kết quả tổng 2 tham số

Khai báo hàm

Cú pháp:

1.	function functionName(parameter1, parameter2, ..., parameterN) {
2.	   //code to be executed
3.	}

Trong đó:

  • functionName: Tên hàm
  • parameter1, parameter2, parameter 3: Danh sách các tham số
  • code to be executed: phần thân hàm (các lệnh thực thi hàm)

Sử dụng hàm

Một hàm cần được khai báo (declare) trước khi được gọi (call). Khi gọi hàm chúng ta cần chú ý đến yêu cầu tham số đầu vào. Khi hàm có trả về giá trị chúng ta sẽ khởi tạo một biến để lưu giá trị nhận được khi gọi hàm.

Ví dụ:

Khai báo hàm sum() để tính tổng hai số:

1.	function sum(fristNumber, secondNumber) {
2.	   return fristNumber + secondNumber;
3.	}

Sử dụng hàm sum() đã được khai báo ở trên:

1.	let total = sum(3, 4);
2.	document.write(total); //Hiển thị 7 ra màn hình

Khi gọi hàm sum(), chúng ta truyền vào hai số 3 và 4, kết quả 3 + 4 = 7 được tính toán bên trong hàm sum() và trả về được lưu trong biến total.

Hàm giúp tái sử dụng mã nguồn

Ví dụ:

Bài toán đặt ra, tính tổng các số từ 1 đến 10, tính tổng các số từ 20 đến 38, tính tổng các số từ 35 đến 55. Nếu không sử dụng hàm, chúng ta cần viết lặp đi lặp lại các đoạn mã tương tự nhau.

Tính tổng các số từ 1 đến 10:

1.	let sum = 0;
2.	for (let index = 1; index <= 10; index++) {
3.	        sum += index;
4.	}
5.	console.log("Sum from 1 to 10 is " + sum);	

 Tính tổng các số từ 20 đến 38:

1.	let sum = 0;
2.	for (var index = 20; index <= 38; index++) {
3.	    sum += index;
4.	}
5.	console.log("Sum from 20 to 38 is " + sum); 

Tính tổng các số từ 35 đến 55:

1.	sum = 0;
2.	for (var index = 35; index <= 55; index++) {       
3.	        sum += index;
4.	}
5.	console.log("Sum from 35 to 55 is " + sum);

Đoạn mã này thực thi tốt và đáp ứng được yêu cầu được đưa ra, tuy nhiên lại xuất hiện rất nhiều dòng mã lặp gần giống nhau. Để tiết kiệm công sức và giúp cho mã nguồn trở nên ngắn gọn và khoa học hơn, chúng ta thử sử dụng hàm trong trường hợp này.

Khai báo hàm sum() tính tổng các số nằm trong khoảng từ startNumber đến endNumber:

1.	function sum(startNumber, endNumber) {
2.	   let total = 0;
3.	   for (let index = startNumber; index <= endNumber; index++) {
4.	       total += index;
5.	   }
6.	   return total;
7.	}

Lần lượt sử dụng hàm sum với các tham số khác nhau:

1.	document.write(sum(1, 10) + "<br>"); //Kết quả: 55
2.	document.write(sum(20, 38)+ "<br>"); //Kết quả: 552
3.	document.write(sum(35, 55)+ "<br>"); //Kết quả: 945

Như vậy, chúng ta có thể dễ dàng nhận thấy rằng việc sử dụng hàm đã giúp mã nguồn ngắn gọn hơn, tránh trùng lặp và quan trọng hơn hết là chúng ta có thể tái sử dụng một cách rất dễ dàng.

Chiến thuật chia để trị

Hình minh hoạ dưới đây thể hiện chiến thuật chia để trị nhằm giải quyết các bài toán lớn. Một bài toán hay một chương trình cần giải quyết một nhiệm vụ khá lớn, bao gồm trong đó nhiều công việc phức tạp khác nhau (từng module), từ các module đó chúng ta có thể tách ra từng công việc nhỏ cụ thể được đưa vào hàm. Khi đó chúng ta sẽ tập trung viết mã lệnh để đi giải quyết từng bài toán nhỏ thay vì viết một khối mã lệnh lớn để giải quyết bài toán tổng thể.

Hàm là chiếc hộp đen

Có thể hình dung hàm như là những chiếc hộp đen có công dụng thực hiện các nhiệm vụ nhất định. Đôi khi người sử dụng hàm không cần quan tâm đến bên trong chiếc hộp, chỉ quan tâm đến đầu vào và đầu ra.

Xem tiếp>> Chuong 6 Gia tri tra ve cua ham

Có thể bạn quan tâm>> Cam nang lap trinh cơ ban danh cho nguoi moi bat dau