Cho tới giờ, bạn có thể nhận ra rằng ta đã định nghĩa
một hàm cụ thể mỗi khi muốn tạo một chương trình--
hàm `draw`.
Để gợi nhắc bạn, đây vẫn là chương trình ảnh động của chiếc xe.
Nó có biến này tên là 'x', giá trị bắt đầu từ 11.
Và sau đó, trong hàm `draw`, nó vẽ chiếc xe ở tọa độ 'x' đó,
và rồi +3 vào biến 'x' trong mỗi lần lặp.
Và kết quả là một chiếc xe hơi
di chuyển 3 pixel trên màn hình liên tục.
Như vậy, đó là cách chương trình hoạt động.
Nhưng bây giờ khi đã học cách tạo các hàm của riêng mình,
bạn có thể tự hỏi, thế còn hàm `draw` thì sao?
Tại sao nó luôn được đặt tên là 'draw`?
Đây có phải là một hàm tùy biến?
Và đó là những câu hỏi rất hay.
Như thấy, trong thư viện ProcessingJS,
hàm `draw` là một trong một số hàm được định nghĩa trước
cho phép các chương trình có quyền điều khiển nhiều hơn những gì đang diễn ra trong khung vẽ.
Hàm được định nghĩa trước là hàm đã được định nghĩa
bởi thư viện ProcessingJS.
Nhưng nó thường bắt đầu với một phần định nghĩa trống trơn.
Ví dụ: trong thư viện ProcessingJS, có đoạn code trông như thế này:
`var draw = function () {}`
và sau đó là không có gì cả, hoàn toàn trống rỗng.
Bây giờ, ta tải thư viện ProcessingJS cho mọi chương trình tại đây trên Khan Academy,
Vì vậy, bạn không bao giờ thấy đoạn code này.
Nhưng hãy tin tôi đi, nó tồn tại đấy.
Bây giờ tôi sẽ comment code đó lại, vì ProcessJS đã làm điều đó cho ta.
Và khi bạn định nghĩa lại `draw`, trong chương trình của chính mình,
định nghĩa mới này ghi đè lên định nghĩa trống trơn trước đó.
Và bây giờ hàm `draw`
thực sự làm nên những điều thú vị, giống như việc vẽ một chiếc xe hơi.
Giờ câu hỏi là, tại sao hàm `draw` được gọi đi gọi lại?
Chà, cũng là code trong thư viện ProcessingJS
thiết lập bộ hẹn giờ cho trình duyệt (browser timer) và gọi lại hàm 'draw' liên tục,
gọi đi gọi lại.
Ta phải đặt tên hàm là 'draw`, vì đó là tên của hàm
được gọi liên tục.
Nếu ta đổi tên cái này, ví dụ như đổi thành thành `drawCar`.
Và trước tiên, ta nhận được một lỗi undefined (chưa định nghĩa), vì vậy ta có thể gõ `var drawCar`.
Giờ bạn có thể thấy, nếu ta đổi tên này thành `drawCar`,
ta không thấy bất kỳ ảnh động nào nữa.
Và đó là vì chức năng này không còn được gọi nhiều lần nữa,
bởi nó không được đặt tên là 'draw'.
Vì vậy, ta phải đặt code muốn được gọi liên tục
bên trong một hàm được đánh vần chính xác là 'draw`.
Như vậy, tôi làm điều đó thêm một lần nữa và gọi `drawCar` từ đây.
Aha! Ta đã lấy lại.
Được rồi, nó cần được gọi là 'draw',
và điều này cũng có nghĩa là takhông nên đặt tên cho các hàm tùy biến của riêng mình `draw`,
trừ khi bạn muốn chúng được đối xử đặc biệt và được gọi đi gọi lại.
Và cũng cần nhớ rằng, bạn không thể có nhiều hàm có tên là 'draw`.
Chỉ định nghĩa hàm cuối cùng sẽ được tính.
Nếu ta có một 'rect' ở trong này--
Giờ ta có thể thấy rằng chiếc xe của ta sẽ không được vẽ nữa,
và chỉ có rect được vẽ, bởi vì chỉ có định nghĩa cuối cùng được tính.
Vì vậy, hãy bỏ cái đó đi.
Hàm 'draw' không phải là hàm duy nhất được định nghĩa trước
có hành vi đặc biệt này.
Ngoài ra còn có một loạt các hàm
phản hồi lại tương tác chuột và nhấn phím.
Giả sử ta muốn có một chương trình vẽ hình elip được tô màu
bất cứ vị trí nào người dùng di con trỏ.
Ta a có thể làm điều đó với một hàm như sau.
Được rồi, ồ, đẹp quá.
Bây giờ, hàm này đang được gọi đi gọi lại,
ngay cả khi người dùng không di chuyển con trỏ như lúc này đây.
Và chương trình này đang hoạt động, nó làm những gì ta muốn,
nó vẽ những hình elip xinh đẹp này trên khắp màn hình.
Nhưng hóa ra, có cách tốt hơn để làm điều tương tự
một cách hiệu quả hơn.
Ta có thể thay hàm `draw` thành` mouseMoved` và xem nào.
Và nó vẫn hoạt động.
Bạn thấy đấy, môi trường của ta kiểm tra các chương trình
để xem chúng đã định nghĩa hàm `mouseMoved` chưa,
và nếu vậy, nó gọi chức năng đó bất cứ khi nào người dùng di chuyển con trỏ.
Nhưng nó sẽ không được gọi nếu người dùng không di chuyển con trỏ.
Như vậy, trước đây, ta đã gọi code trong hàm `draw`
khi ta không cần, lặp đi lặp lại.
Và bây giờ, ta chỉ gọi code này trong `mouseMoved`
khi mouseX hoặc mouseY thực sự thay đổi giá trị.
Như vậy, chương trình hoạt động hiệu quả hơn, và đó là một điều tốt.
Nói chung, chỉ muốn thay đổi kết quả chương trình
Khi người dùng di chuyển con trỏ, tốt hơn là nên đặt code đó
bên trong hàm `mouseMoved`.
Và có một loạt các hàm được định nghĩa trước như thế,
bạn có thể xem thêm ví dụ trong tài liệu.
như là `mousePression`,` mouseRelazed`, `keyPression`, v.v.
Hãy nhớ rằng, nếu bạn muốn sử dụng một hàm được định nghĩa đặc biệt trước đó,
như `mouseMoved` hoặc` draw`, đánh vần thật chính xác và sử dụng đúng.
Nếu không, hãy chắc chắn rằng định nghĩa các hàm tùy biến của mình
bằng một cái tên mới, độc đáo hơn.