Giờ hãy nói về thứ mà ta đã dùng trong toàn bộ thời gian này: Hàm. Bất cứ khi nào bạn đã sử dụng các lệnh như rect() hoặc fill() hoặc text(), ta đã gọi các hàm và hàm đó vẽ nên những gì ta bảo chúng làm. Một hàm thực sự là gì? Đó là một bộ code mà ta nhóm lại với nhau và được đặt tên bởi ta muốn dùng hàm đó nhiều lần. Hãy nghĩ về rect()? Hàm rect() làm gì? Nó chỉ vẽ bốn dòng thôi, phải không? Ta chỉ có thể làm điều đó bằng cách dùng hàm line(), phải không? Và ở đây ta thứ trông giống hình chữ nhật. Nhưng ta nhận ra rằng ta muốn vẽ một hình chữ nhật rất nhiều lần, và nó sẽ thực sự phiền toái khi phải làm toán mỗi lần để thử và tìm ra cách vẽ một đường từ góc này sang góc khác và tiếp nữa, tiếp nữa. Vì vậy, thay vào đó, ta chỉ cần hàm rect() thôi, và hàm đó thực hiện chính xác điều tương tự như 4 dòng code đó đã làm, nhưng code thì ít hơn nhiều. Vì vậy, nó thật tuyệt, và rect() là một trong những hàm đó, ta đã có sẵn cho TẤT CẢ các chương trình để dùng ở đây, trên Khan Academy. Nhưng bạn cũng có thể tạo nên các hàm của riêng mình để dùng trong các chương trình của mình. Giả sử ta đang viết một chương trình và ta muốn vẽ Winston nhiều lần - có lẽ bởi ta sẽ kể chuyện đời của Winston và thể hiện anh ấy ở mọi lứa tuổi trong đời. Vì vậy, đây là code vẽ Winston, ta có thể bắt đầu như sau: Ta có các biến 'faceX' và 'faceY' để lưu tâm điểm của khuôn mặt, và rồi ta vẽ mắt và miệng tương ứng với các biến đó. Ngay bây giờ chương trình đã thấy code, 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, và nó chỉ chạy một lần mà thôi. OK, hãy biến nó thành một hàm. Để làm được điều đó, ta làm nó như cách khai báo một biến, vì đó thực sự là những gì ta làm. Vì vậy, ta gõ 'var drawWinston'. Ta đặt cho nó một cái tên đẹp, rất gợi tả, và sau đó là dấu '=', nhưng ở đây, thay vì viết một số hoặc một chuỗi, ta sẽ viết 'hàm' (chắc chắn bạn đánh vần đúng nhé) và sau đó là dấu ngoặc đơn rỗng '()' và sau đó là một dấu ngoặc nhọn '{' và sau đó là dấu ngoặc nhọn nữa '}' và dấu chấm phẩy ';' OK, những gì ta cần làm là đặt mọi thứ ta muốn bên trong hàm ở giữa ngoặc nhọn bắt đầu '{' và kết thúc '}'. Vì vậy, ta sẽ lấy tất cả code ở chỗ này, đặt vào trong hàm (thụt lề cho đẹp) và Ta Da! Như vậy, giờ ta có biến này để lưu một hàm - vì vậy về cơ bản ta đã đưa ra một nhãn cho khối code này, để ta có thể gọi nó bất cứ lúc nào, "Này, hãy tìm khối code có nhãn đó và chạy nó!" Ta đã khiến cho đoạn code này có thể tái sử dụng. Nhưng giờ đây để ý rằng ta không còn Winston nữa! Ta đã mất Winston rồi! Anh ấy đã đi đâu nhỉ? OK - Những gì xảy ra là khi ta đặt cái này vào trong một hàm, ta nói với chương trình rằng "đây là một loạt các code mà anh muốn chạy sau này, nhưng chỉ khi anh bảo chú chạy thôi nhé" Vì vậy, ta phải bảo nó chạy code, có nghĩa là ta cần 'gọi' hàm - giống như ta làm với ellipse() và rect() và line(). Vì vậy, ta chỉ cần viết tên hàm ('drawWinston') theo sau là dấu ngoặc đơn bắt đầu và kết thúc '()' và, tất nhiên, dấu chấm phẩy và Ta Đa - Ta đã có lại Winston rồi! OK! Như vậy, tôi nghĩ rằng nó ngon đấy, nhưng bạn có thể thấy nó chưa ổn 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 những gì nó đã làm trước đó. Nghe có vẻ ngớ ngẩn nhỉ? Toàn bộ ưu điểm của hàm là ta có thể tái sử dụng chúng. Như vậy, hãy làm ngay bây giờ thôi. 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 Hmmm, nhưng nó trông giống nhau - - ngon - nó đã hoạt động - và đang vẽ nhiều Winstons, nhưng vấn đề là tất cả đều ở cùng một chỗ Nếu ta có tia X, ta có thể chụp X-quang và thấy ba Winstons, nhưng tôi không có tia X. (Tôi không biết bạn có không). Nhưng, ta có thể thay đổi một chút trong hàm Để khiến nó rõ ràng hơn. Như vậy, bạn thấy faceX và faceY - luôn luôn là 202 và 208? Ta có thể thay đổi nó bằng hàm random() - - hãy gõ random() từ 50 đến 350 và nó sẽ tạo ra một số ngẫu nhiên trong khoảng đó - và ta có thể làm điều tương tự ở đây - 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, và nếu khởi động lại, ta có thể có được các Winstons xuất hiện ngẫu nhiên. Thật tuyệt! Whoo!! Được rồi - như vậy tôi nghĩ ngon rồi đáy vì nó sẽ tốn khá nhiều code để viết cái này nếu ta không gói trong một hàm. Nó sẽ phải code gấp 3 lần. Nhưng nó vẫn không hữu dụng cho lắm, bởi vì có lẽ ta không muốn Winstons xuất hiện ngẫu nhiên. Ta muốn có thể xác định vị trí cho Winston tại các điểm cụ thể trên màn hình. Vì vậy, hãy theo dõi, vì ta sẽ nói về cách truyền các tham số để các hàm sau đây có thể để làm chính xác điều đó.