JavaScript Tip: Đặt tên function để debugging một cách dễ dàng hơn.
Bài đăng này đã không được cập nhật trong 6 năm

- Debug không phải là thứ chung ta nghĩ đến hay nên nghĩ trong quá trình viết code. Nhưng nó lại là nhân tố chính giúp chúng ta vượt qua được những cơn khủng hoảng, lụt lội khi ứng dụng gặp lỗi.
- Một cách hiệu quả để debug trong js là bạn hãy đặt tên cho những hàm nặc danh
(anonymous function). Nếu bạn chưa biếtanonymous functionlà gì có thể xem ví dụ ở dưới
// anonymous functions
function() {}
() => {}
// named functions
function toDoSomething() {}
const toDoSomething = () => {
- Thông thường bạn sẽ có các function gọi những function khác, một số khác có thể được gọi từ những event listener, chẳng bạn như
windown.load.
Ví dụ:
function Page() {
window.addEventListener('load', function() {
console.log('Page loaded!');
Page.init();
});
}
function App() {
Page();
}
App();
- Trong đoạn code trên có 1 lỗi. Và khi chạy nó bạn sẽ nhận được một lỗi trên bạn có thể nhận được một thông báo lỗi trong developer tools console như sau:
Uncaught TypeError: Page.init is not a function
at <anonymous> (index.js:1:6)
(anonymous) @ index.js:4
load (async)
Page @ index.js:2
App @ index.js:9
- Đoạn thông báo dưới đây được hiện thị trên expanded console message và nó là một stack trace. Đến đây bạn có nhận thấy các chức năng mà ta đã đặt tên đó là
PagevàApp?. Vậy còn sự kiệnwindow.addEventListenerthì sao, nó đâu rồi ?. - À ừ thì nó là 1
anonymous functionnên sẽ không hiện lên trên này đâu. Hay tưởng tượng function của bạn viết ra được gọi và thực thi trên 1anonymous functionvàanonymous functionđó được gọi lại trong 1anonymous functionkhác. - Rất rắc rối và khó hiểu đúng không. Chính vì thế trên
logsẽ không lưu ra cácanonymous functiongọi hàm bị lỗi trong stack trace và nếu códebugthì cũng phải mò hàm để thực hiện.
Vậy ta thử khắc phục điều này bằng các thêm tên cho anonymous function đó xem sao.
function Page() {
window.addEventListener('load', function pageLoadHandler() {
console.log('Page loaded!');
Page.init();
});
}
function App() {
Page();
}
App();
Vẫn là lỗi đó nhưng ta có hiển thị khác trên log.
Uncaught TypeError: Page.init is not a function
at pageLoadHandler (index.js:1:6)
pageLoadHandler @ index.js:4
load (async)
Page @ index.js:2
App @ index.js:9
- Kết quả như ta thấy rõ. Chúng ta có thể thấy tên hàm
pageLoadHandlerđược nhắc đến trong developer tools console thay vì(anonymous). - Đối với các phương thức đơn giản như
.map(),.filter()bạn có thể dùnganonymousmiễn làparent functioncó tên là được. Việc bạn sử dụnganonymoushay đặt tên thật sự không có nhiều thay đổi trong quá trình lập trình. - Nhưng nó lại quyết định việc về sau bạn sẽ debug một cách nhanh chóng. Mình thường có một cách là đặt tên các
anonymous functionlàahihi1, ahihi2, ...``` về sau khi code xong mình sẽ xóa các hàm này. Điều này giúp mình xác định được chính xác lỗi xuất phát từ đâu cũng như về sau chỉ cầnCtrl + Shift + F` là mình có thể xóa tên các hàm này 1 cách nhanh chóng.
Cảm ơn các bạn đã đón đọc.
All rights reserved