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