1 00:00:01,383 --> 00:00:03,649 Giờ hãy nói về thứ mà ta đã dùng 2 00:00:03,649 --> 00:00:05,685 trong toàn bộ thời gian này: Hàm. 3 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(), 4 00:00:09,140 --> 00:00:12,376 ta đã gọi các hàm và hàm đó vẽ nên 5 00:00:12,376 --> 00:00:15,132 những gì ta bảo chúng làm. 6 00:00:15,132 --> 00:00:16,806 Một hàm thực sự là gì? 7 00:00:16,806 --> 00:00:19,483 Đó là một bộ code mà ta nhóm lại với nhau 8 00:00:19,483 --> 00:00:21,240 và được đặt tên bởi ta muốn 9 00:00:21,240 --> 00:00:23,168 dùng hàm đó nhiều lần. 10 00:00:23,368 --> 00:00:25,981 Hãy nghĩ về rect()? Hàm rect() làm gì? 11 00:00:25,981 --> 00:00:28,551 Nó chỉ vẽ bốn dòng thôi, phải không? 12 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? 13 00:00:31,141 --> 00:00:33,847 Và ở đây ta thứ trông giống hình chữ nhật. 14 00:00:33,847 --> 00:00:36,751 Nhưng ta nhận ra rằng ta muốn 15 00:00:36,751 --> 00:00:39,322 vẽ một hình chữ nhật rất nhiều lần, 16 00:00:39,322 --> 00:00:40,773 và nó sẽ thực sự phiền toái 17 00:00:40,773 --> 00:00:42,784 khi phải làm toán mỗi lần để thử và tìm ra 18 00:00:42,784 --> 00:00:44,282 cách vẽ một đường từ góc này sang góc khác 19 00:00:44,282 --> 00:00:45,818 và tiếp nữa, tiếp nữa. 20 00:00:45,818 --> 00:00:48,538 Vì vậy, thay vào đó, ta chỉ cần hàm rect() thôi, 21 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ư 22 00:00:50,858 --> 00:00:55,148 4 dòng code đó đã làm, nhưng code thì ít hơn nhiều. 23 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 đó, 24 00:00:58,399 --> 00:01:00,519 ta đã có sẵn cho TẤT CẢ các chương trình 25 00:01:00,519 --> 00:01:02,729 để dùng ở đây, trên Khan Academy. 26 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 27 00:01:05,339 --> 00:01:08,409 để dùng trong các chương trình của mình. 28 00:01:08,409 --> 00:01:11,430 Giả sử ta đang viết một chương trình 29 00:01:11,430 --> 00:01:14,434 và ta muốn vẽ Winston nhiều lần - 30 00:01:14,434 --> 00:01:17,017 có lẽ bởi ta sẽ kể chuyện đời của Winston 31 00:01:17,017 --> 00:01:20,190 và thể hiện anh ấy ở mọi lứa tuổi trong đời. 32 00:01:20,190 --> 00:01:24,243 Vì vậy, đây là code vẽ Winston, ta có thể bắt đầu như sau: 33 00:01:24,243 --> 00:01:27,106 Ta có các biến 'faceX' và 'faceY' 34 00:01:27,106 --> 00:01:29,029 để lưu tâm điểm của khuôn mặt, 35 00:01:29,029 --> 00:01:31,243 và rồi ta vẽ mắt và miệng 36 00:01:31,243 --> 00:01:33,039 tương ứng với các biến đó. 37 00:01:33,039 --> 00:01:34,732 Ngay bây giờ chương trình đã thấy code, 38 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, 39 00:01:37,325 --> 00:01:39,739 và nó chỉ chạy một lần mà thôi. 40 00:01:39,739 --> 00:01:43,717 OK, hãy biến nó thành một hàm. 41 00:01:43,717 --> 00:01:46,439 Để làm được điều đó, ta làm nó như cách 42 00:01:46,439 --> 00:01:48,487 khai báo một biến, vì đó thực sự là 43 00:01:48,487 --> 00:01:50,245 những gì ta làm. 44 00:01:50,245 --> 00:01:52,077 Vì vậy, ta gõ 'var drawWinston'. 45 00:01:52,077 --> 00:01:54,551 Ta đặt cho nó một cái tên đẹp, rất gợi tả, 46 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, 47 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é) 48 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 '{' 49 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 ';' 50 00:02:11,563 --> 00:02:14,490 OK, những gì ta cần làm là đặt mọi thứ 51 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 '}'. 52 00:02:19,454 --> 00:02:22,130 Vì vậy, ta sẽ lấy tất cả code ở chỗ này, 53 00:02:22,130 --> 00:02:26,816 đặt vào trong hàm (thụt lề cho đẹp) và Ta Da! 54 00:02:26,816 --> 00:02:28,970 Như vậy, giờ ta có biến này 55 00:02:28,970 --> 00:02:32,379 để lưu một hàm - vì vậy về cơ bản ta đã đưa ra 56 00:02:32,379 --> 00:02:35,759 một nhãn cho khối code này, để ta có thể gọi 57 00:02:35,759 --> 00:02:37,859 nó bất cứ lúc nào, 58 00:02:37,859 --> 00:02:40,765 "Này, hãy tìm khối code có nhãn đó và chạy nó!" 59 00:02:40,765 --> 00:02:43,551 Ta đã khiến cho đoạn code này có thể tái sử dụng. 60 00:02:43,551 --> 00:02:46,535 Nhưng giờ đây để ý rằng ta không còn Winston nữa! 61 00:02:46,535 --> 00:02:49,357 Ta đã mất Winston rồi! Anh ấy đã đi đâu nhỉ? 62 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, 63 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 64 00:02:55,907 --> 00:02:57,842 mà anh muốn chạy sau này, 65 00:02:57,842 --> 00:03:00,807 nhưng chỉ khi anh bảo chú chạy thôi nhé" 66 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 67 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(). 68 00:03:09,400 --> 00:03:13,753 Vì vậy, ta chỉ cần viết tên hàm ('drawWinston') 69 00:03:13,753 --> 00:03:16,376 theo sau là dấu ngoặc đơn bắt đầu và kết thúc '()' 70 00:03:16,376 --> 00:03:18,959 và, tất nhiên, dấu chấm phẩy và Ta Đa - 71 00:03:18,959 --> 00:03:20,942 Ta đã có lại Winston rồi! 72 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 73 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 74 00:03:27,373 --> 00:03:30,239 những gì nó đã làm trước đó. Nghe có vẻ ngớ ngẩn nhỉ? 75 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. 76 00:03:32,920 --> 00:03:34,957 Như vậy, hãy làm ngay bây giờ thôi. 77 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 78 00:03:41,162 --> 00:03:46,572 Hmmm, nhưng nó trông giống nhau - - ngon - nó đã hoạt động - 79 00:03:46,572 --> 00:03:48,998 và đang vẽ nhiều Winstons, nhưng vấn đề là 80 00:03:48,998 --> 00:03:51,474 tất cả đều ở cùng một chỗ 81 00:03:51,474 --> 00:03:54,428 Nếu ta có tia X, ta có thể chụp X-quang 82 00:03:54,428 --> 00:03:57,631 và thấy ba Winstons, nhưng tôi không có tia X. 83 00:03:57,631 --> 00:04:00,334 (Tôi không biết bạn có không). 84 00:04:00,334 --> 00:04:03,440 Nhưng, ta có thể thay đổi một chút trong hàm 85 00:04:03,440 --> 00:04:05,486 Để khiến nó rõ ràng hơn. 86 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? 87 00:04:08,825 --> 00:04:11,587 Ta có thể thay đổi nó bằng hàm random() - 88 00:04:11,587 --> 00:04:14,849 - hãy gõ random() từ 50 đến 350 và nó sẽ tạo ra 89 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 - 90 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, 91 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. 92 00:04:26,566 --> 00:04:29,359 Thật tuyệt! Whoo!! 93 00:04:29,359 --> 00:04:32,095 Được rồi - như vậy tôi nghĩ ngon rồi đáy vì nó sẽ 94 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. 95 00:04:34,916 --> 00:04:38,317 Nó sẽ phải code gấp 3 lần. 96 00:04:38,317 --> 00:04:40,960 Nhưng nó vẫn không hữu dụng cho lắm, 97 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. 98 00:04:43,796 --> 00:04:45,736 Ta muốn có thể xác định vị trí cho Winston 99 00:04:45,736 --> 00:04:47,846 tại các điểm cụ thể trên màn hình. 100 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ố 101 00:04:49,943 --> 00:04:52,000 để các hàm sau đây có thể 102 00:04:52,000 --> 00:00:00,000 để làm chính xác điều đó.