WEBVTT 00:00:01.383 --> 00:00:03.649 Giờ hãy nói về thứ mà ta đã dùng 00:00:03.649 --> 00:00:05.685 trong toàn bộ thời gian này: Hàm. 00:00:05.685 --> 00:00:09.140 Bất cứ khi nào bạn đã sử dụng các lệnh như rect() hoặc fill() hoặc text(), 00:00:09.140 --> 00:00:12.376 ta đã gọi các hàm và hàm đó vẽ nên 00:00:12.376 --> 00:00:15.132 những gì ta bảo chúng làm. 00:00:15.132 --> 00:00:16.806 Một hàm thực sự là gì? 00:00:16.806 --> 00:00:19.483 Đó là một bộ code mà ta nhóm lại với nhau 00:00:19.483 --> 00:00:21.240 và được đặt tên bởi ta muốn 00:00:21.240 --> 00:00:23.168 dùng hàm đó nhiều lần. 00:00:23.368 --> 00:00:25.981 Hãy nghĩ về rect()? Hàm rect() làm gì? 00:00:25.981 --> 00:00:28.551 Nó chỉ vẽ bốn dòng thôi, phải không? 00:00:28.551 --> 00:00:31.141 Ta chỉ có thể làm điều đó bằng cách dùng hàm line(), phải không? 00:00:31.141 --> 00:00:33.847 Và ở đây ta thứ trông giống hình chữ nhật. 00:00:33.847 --> 00:00:36.751 Nhưng ta nhận ra rằng ta muốn 00:00:36.751 --> 00:00:39.322 vẽ một hình chữ nhật rất nhiều lần, 00:00:39.322 --> 00:00:40.773 và nó sẽ thực sự phiền toái 00:00:40.773 --> 00:00:42.784 khi phải làm toán mỗi lần để thử và tìm ra 00:00:42.784 --> 00:00:44.282 cách vẽ một đường từ góc này sang góc khác 00:00:44.282 --> 00:00:45.818 và tiếp nữa, tiếp nữa. 00:00:45.818 --> 00:00:48.538 Vì vậy, thay vào đó, ta chỉ cần hàm rect() thôi, 00:00:48.538 --> 00:00:50.858 và hàm đó thực hiện chính xác điều tương tự như 00:00:50.858 --> 00:00:55.148 4 dòng code đó đã làm, nhưng code thì ít hơn nhiều. 00:00:55.148 --> 00:00:58.399 Vì vậy, nó thật tuyệt, và rect() là một trong những hàm đó, 00:00:58.399 --> 00:01:00.519 ta đã có sẵn cho TẤT CẢ các chương trình 00:01:00.519 --> 00:01:02.729 để dùng ở đây, trên Khan Academy. 00:01:02.729 --> 00:01:05.339 Nhưng bạn cũng có thể tạo nên các hàm của riêng mình 00:01:05.339 --> 00:01:08.409 để dùng trong các chương trình của mình. 00:01:08.409 --> 00:01:11.430 Giả sử ta đang viết một chương trình 00:01:11.430 --> 00:01:14.434 và ta muốn vẽ Winston nhiều lần - 00:01:14.434 --> 00:01:17.017 có lẽ bởi ta sẽ kể chuyện đời của Winston 00:01:17.017 --> 00:01:20.190 và thể hiện anh ấy ở mọi lứa tuổi trong đời. 00:01:20.190 --> 00:01:24.243 Vì vậy, đây là code vẽ Winston, ta có thể bắt đầu như sau: 00:01:24.243 --> 00:01:27.106 Ta có các biến 'faceX' và 'faceY' 00:01:27.106 --> 00:01:29.029 để lưu tâm điểm của khuôn mặt, 00:01:29.029 --> 00:01:31.243 và rồi ta vẽ mắt và miệng 00:01:31.243 --> 00:01:33.039 tương ứng với các biến đó. 00:01:33.039 --> 00:01:34.732 Ngay bây giờ chương trình đã thấy code, 00:01:34.732 --> 00:01:37.325 và nó không nằm trong bất kỳ hàm nào cả, vì vậy nó chỉ chạy bình thường, 00:01:37.325 --> 00:01:39.739 và nó chỉ chạy một lần mà thôi. 00:01:39.739 --> 00:01:43.717 OK, hãy biến nó thành một hàm. 00:01:43.717 --> 00:01:46.439 Để làm được điều đó, ta làm nó như cách 00:01:46.439 --> 00:01:48.487 khai báo một biến, vì đó thực sự là 00:01:48.487 --> 00:01:50.245 những gì ta làm. 00:01:50.245 --> 00:01:52.077 Vì vậy, ta gõ 'var drawWinston'. 00:01:52.077 --> 00:01:54.551 Ta đặt cho nó một cái tên đẹp, rất gợi tả, 00:01:54.551 --> 00:01:59.037 và sau đó là dấu '=', nhưng ở đây, thay vì viết một số hoặc một chuỗi, 00:01:59.037 --> 00:02:02.721 ta sẽ viết 'hàm' (chắc chắn bạn đánh vần đúng nhé) 00:02:02.721 --> 00:02:08.357 và sau đó là dấu ngoặc đơn rỗng '()' và sau đó là một dấu ngoặc nhọn '{' 00:02:08.357 --> 00:02:11.563 và sau đó là dấu ngoặc nhọn nữa '}' và dấu chấm phẩy ';' 00:02:11.563 --> 00:02:14.490 OK, những gì ta cần làm là đặt mọi thứ 00:02:14.490 --> 00:02:19.454 ta muốn bên trong hàm ở giữa ngoặc nhọn bắt đầu '{' và kết thúc '}'. 00:02:19.454 --> 00:02:22.130 Vì vậy, ta sẽ lấy tất cả code ở chỗ này, 00:02:22.130 --> 00:02:26.816 đặt vào trong hàm (thụt lề cho đẹp) và Ta Da! 00:02:26.816 --> 00:02:28.970 Như vậy, giờ ta có biến này 00:02:28.970 --> 00:02:32.379 để lưu một hàm - vì vậy về cơ bản ta đã đưa ra 00:02:32.379 --> 00:02:35.759 một nhãn cho khối code này, để ta có thể gọi 00:02:35.759 --> 00:02:37.859 nó bất cứ lúc nào, 00:02:37.859 --> 00:02:40.765 "Này, hãy tìm khối code có nhãn đó và chạy nó!" 00:02:40.765 --> 00:02:43.551 Ta đã khiến cho đoạn code này có thể tái sử dụng. 00:02:43.551 --> 00:02:46.535 Nhưng giờ đây để ý rằng ta không còn Winston nữa! 00:02:46.535 --> 00:02:49.357 Ta đã mất Winston rồi! Anh ấy đã đi đâu nhỉ? 00:02:49.357 --> 00:02:53.025 OK - Những gì xảy ra là khi ta đặt cái này vào trong một hàm, 00:02:53.025 --> 00:02:55.907 ta nói với chương trình rằng "đây là một loạt các code 00:02:55.907 --> 00:02:57.842 mà anh muốn chạy sau này, 00:02:57.842 --> 00:03:00.807 nhưng chỉ khi anh bảo chú chạy thôi nhé" 00:03:00.807 --> 00:03:04.288 Vì vậy, ta phải bảo nó chạy code, có nghĩa là ta cần 00:03:04.288 --> 00:03:09.110 'gọi' hàm - giống như ta làm với ellipse() và rect() và line(). 00:03:09.400 --> 00:03:13.753 Vì vậy, ta chỉ cần viết tên hàm ('drawWinston') 00:03:13.753 --> 00:03:16.376 theo sau là dấu ngoặc đơn bắt đầu và kết thúc '()' 00:03:16.376 --> 00:03:18.959 và, tất nhiên, dấu chấm phẩy và Ta Đa - 00:03:18.959 --> 00:03:20.942 Ta đã có lại Winston rồi! 00:03:20.942 --> 00:03:24.237 OK! Như vậy, tôi nghĩ rằng nó ngon đấy, nhưng bạn có thể thấy nó chưa ổn 00:03:24.237 --> 00:03:27.373 bởi tất cả những gì ta vừa làm là khiến máy tính thực hiện chính xác 00:03:27.373 --> 00:03:30.239 những gì nó đã làm trước đó. Nghe có vẻ ngớ ngẩn nhỉ? 00:03:30.239 --> 00:03:32.920 Toàn bộ ưu điểm của hàm là ta có thể tái sử dụng chúng. 00:03:32.920 --> 00:03:34.957 Như vậy, hãy làm ngay bây giờ thôi. 00:03:34.957 --> 00:03:41.162 Ta chỉ có thể copy và paste hàm tên là "ta da!" "ta da!" thêm lần nữa và thêm lần nữa 00:03:41.162 --> 00:03:46.572 Hmmm, nhưng nó trông giống nhau - - ngon - nó đã hoạt động - 00:03:46.572 --> 00:03:48.998 và đang vẽ nhiều Winstons, nhưng vấn đề là 00:03:48.998 --> 00:03:51.474 tất cả đều ở cùng một chỗ 00:03:51.474 --> 00:03:54.428 Nếu ta có tia X, ta có thể chụp X-quang 00:03:54.428 --> 00:03:57.631 và thấy ba Winstons, nhưng tôi không có tia X. 00:03:57.631 --> 00:04:00.334 (Tôi không biết bạn có không). 00:04:00.334 --> 00:04:03.440 Nhưng, ta có thể thay đổi một chút trong hàm 00:04:03.440 --> 00:04:05.486 Để khiến nó rõ ràng hơn. 00:04:05.486 --> 00:04:08.825 Như vậy, bạn thấy faceX và faceY - luôn luôn là 202 và 208? 00:04:08.825 --> 00:04:11.587 Ta có thể thay đổi nó bằng hàm random() - 00:04:11.587 --> 00:04:14.849 - hãy gõ random() từ 50 đến 350 và nó sẽ tạo ra 00:04:14.849 --> 00:04:19.183 một số ngẫu nhiên trong khoảng đó - và ta có thể làm điều tương tự ở đây - 00:04:19.183 --> 00:04:23.023 và như vậy mỗi khi hàm này được gọi, nó sẽ tạo ra số ngẫu nhiên mới, 00:04:23.023 --> 00:04:26.566 và nếu khởi động lại, ta có thể có được các Winstons xuất hiện ngẫu nhiên. 00:04:26.566 --> 00:04:29.359 Thật tuyệt! Whoo!! 00:04:29.359 --> 00:04:32.095 Được rồi - như vậy tôi nghĩ ngon rồi đáy vì nó sẽ 00:04:32.095 --> 00:04:34.916 tốn khá nhiều code để viết cái này nếu ta không gói trong một hàm. 00:04:34.916 --> 00:04:38.317 Nó sẽ phải code gấp 3 lần. 00:04:38.317 --> 00:04:40.960 Nhưng nó vẫn không hữu dụng cho lắm, 00:04:40.960 --> 00:04:43.796 bởi vì có lẽ ta không muốn Winstons xuất hiện ngẫu nhiên. 00:04:43.796 --> 00:04:45.736 Ta muốn có thể xác định vị trí cho Winston 00:04:45.736 --> 00:04:47.846 tại các điểm cụ thể trên màn hình. 00:04:47.846 --> 00:04:49.943 Vì vậy, hãy theo dõi, vì ta sẽ nói về cách truyền các tham số 00:04:49.943 --> 00:04:52.000 để các hàm sau đây có thể 00:04:52.000 --> 00:00:00.000 để làm chính xác điều đó.