Này Peeps,
Tôi đã sử dụng JS một thời gian, nhưng gần đây tôi chỉ nên kiểm tra xem một trong những thói quen của tôi không phải là hình thức xấu khủng khiếp hay gây ra cho tôi các vấn đề về trí nhớ/hiệu quả, v.v.
Vì vậy, đây là vấn đề nan giải:
function setupExample[]{
var button1 = document.getElementById["button1"];
var button2 = document.getElementById["button2"];
var button3 = document.getElementById["button3"];
button1.addEventListener["click", toggleExampleOne];
button2.addEventListener["click", toggleExampleTwo];
button3.addEventListener["click", toggleExampleThree];
function toggleExampleOne[]{
button1.classList.toggle["activated"];
}//END toggleExampleOne
function toggleExampleTwo[event]{
event.srcElement.classList.toggle["activated"];
}//END toggleExampleTwo
}//END setupExample
function toggleExampleThree[event]{
event.srcElement.classList.toggle["activated"]
}//END toggleExampleThree
Bây giờ, tôi sử dụng một cấu trúc như thế này khá thường xuyên - tôi có xu hướng sử dụng ví dụ 1 trong trường hợp này - nhưng mối quan tâm của tôi bây giờ là bằng cách tham chiếu các giá trị bên ngoài chức năng được gọi bởi sự kiện nhấp chuột, toàn bộ 'setupExample' sẽ được giữ trong bộ nhớ Khi tất cả những gì tôi thực sự cần là các chức năng chuyển đổi!
Ví dụ 2 hoặc 3 tốt hơn trong trường hợp này, hoặc tôi không lo lắng về không có gì và hoàn toàn không có sự khác biệt giữa ba?
Cảm ơn trước, nhìn trộm!
-P
CẢNH BÁO: Hàm từ xuất hiện thường xuyên hơn bạn có thể đã quen. Xin lỗi.
Được rồi, hãy bắt đầu: Các chức năng lồng nhau là các hàm được xác định bên trong các chức năng khác [hứa hẹn và phân phối]. Bạn đã thấy chúng dưới nhiều hình thức, như thế này:
Ở đây, hàm multiply
được xác định bên trong cha mẹ của nó, pow
, mặc dù nó không phải là theo cách này.
Hay nó? Nếu không có gì khác sử dụng nhân, có lý do nào để chuyển nó ra không?
Chủ đề này thường xuyên đốt cháy các cuộc trò chuyện về xe đạp dài bất kể ngôn ngữ lập trình [Stack Overflow về Python, Reddit về Swift], vì vậy tôi muốn nhảy vào và liệt kê thêm một số ưu và nhược điểm mà bạn có thể áp dụng cho nhu cầu của mình.
Tại sao bạn không nên sử dụng chức năng lồng nhaunot use nested function
Các chức năng lồng nhau làm giảm khả năng đọc
Chức năng càng lớn thì càng khó đọc nó. Nhìn vào ví dụ này:
Look at this example:
Bằng cách xác định ba chức năng bổ sung bên trong showNews
, bạn làm cho công việc của người đọc trở nên khó khăn hơn: họ phải quét tất cả chúng trước khi đạt được phần với logic thực tế.
Nó có thể ngắn hơn nhiều:
Người đọc vẫn có thể nhảy đến bất kỳ chức năng nào để xem cách chúng hoạt động, nhưng bây giờ nó là tùy chọn.
Các chức năng lồng nhau ảnh hưởng đến sự tăng trưởng trong tương lai
Người ta có thể lập luận rằng không phải tất cả các chức năng lồng nhau đều ảnh hưởng đến khả năng đọc.
Trong ví dụ trước, bạn đã có ba người trợ giúp lớn - khá tệ. Nếu chỉ có một?
Có loadNews
bên trong chức năng chính có gây hại gì không? Rốt cuộc, nó chỉ là một vài dòng bổ sung.
Sự nguy hiểm của phương pháp này cho thấy chính nó khi ai đó cần thêm nhiều chức năng hơn. Bạn không nên ngạc nhiên khi các đồng nghiệp của bạn theo cùng một phong cách và thêm các chức năng lồng nhau khác bên cạnh các chức năng hiện có. Rốt cuộc, họ chỉ tuân theo các quy tắc bạn định nghĩa là một tác giả.
Tất cả những gì cần thiết để làm giảm một cơ sở mã tốt là một ví dụ về mô hình kém và ý định của mọi người để duy trì kiểu mã.Kiểm tra bài viết về "tái sử dụng liều lĩnh" để biết thêm các ví dụ về cách mã trở nên không thể giải quyết được mà không ai nhận ra.
Khi các chức năng lồng nhau tốt
Bây giờ bạn có thể có một ý tưởng rằng tất cả các chức năng lồng nhau là xấu và nên tránh bằng bất kỳ phương tiện nào.
Đây không phải là sự thật.
Trong một số trường hợp, họ mang lại một số lợi ích có thể vượt xa những bất lợi.
Đôi khi bạn không muốn người khác sử dụng các chức năng của mình
Vâng, các chức năng có nghĩa là được tái sử dụng. Nhưng bạn có thể không muốn nó, ví dụ: Nếu một chức năng xử lý trường hợp cụ thể của bạn nhưng không phù hợp với mọi người:
Có nhiều trường hợp trong đó isEqual
trả về một kết quả bất ngờ:
Nhưng nó có thể là hành vi chính xác bạn cần.
Trong trường hợp này, sẽ an toàn hơn khi xác định chức năng này bên trong saveNews
để không ai phải đối phó với đặc thù của nó.
Đôi khi bạn cần truy cập vào một phạm vi bên ngoài
Nhiều ngôn ngữ cho phép các hàm lồng nhau truy cập vào các biến từ phạm vi cha mẹ và thậm chí cho phép sửa đổi chúng. Bạn có thể cần phải khai báo rõ ràng các biến như vậy [Python] hoặc nắm bắt chúng bằng tham chiếu [C ++], nhưng các lợi ích là như nhau:
Trong trường hợp này, giải pháp thay thế sẽ chuyển tất cả các đối số cho handleError
mỗi khi chúng tôi gọi nó, sử dụng Function.prototype.bind
hoặc gói nó vào một nhà máy. Mặc dù tôi thích những thứ khác nhau tùy thuộc vào tình huống, tôi thấy tại sao ai đó có thể sử dụng các chức năng lồng nhau ở đây.
Một số chi tiết thực hiện rất hữu ích
Từ quan điểm của người đọc, có một vài điều tồi tệ hơn là nhảy giữa các chức năng để hiểu cách thức toàn bộ hoạt động.
Cố gắng hiểu tác phẩm này:
Các chức năng onSuccess
và multiply
0 không chỉ ẩn các chi tiết thực hiện mà còn che khuất mục đích của chúng. Bạn biết điều gì đó xảy ra, nhưng bạn không biết chính xác những gì.
Trong trường hợp này, sẽ tốt hơn nếu xác định onSuccess
và multiply
0 trong chức năng chính để người đọc biết những gì đang xảy ra mà không để lại nó:
Hai điều cần lưu ý ở đây:
- Chi tiết triển khai vẫn còn ẩn: bạn biết những gì đang xảy ra nhưng không phải là cách
- Cố gắng tránh các tình huống như thế này bằng cách đặt tên tốt hơn và xác định API tốt hơn. Nhược điểm của các chức năng lồng nhau vẫn còn đó.
Vậy lam gi?
Tôi thường cố gắng tránh các chức năng lồng nhau vì chúng làm cho cha mẹ của họ lớn hơn và kết quả là, khó đọc hơn. Ngay cả khi một chức năng lồng nhau là súc tích và tác động là không đáng kể, nó có khả năng trở thành một độ dốc trơn trượt và phục vụ như một ví dụ tồi tệ để thêm các kích hoạt tương tự.
Nhưng, như bạn có thể thấy, có một số tình huống khi đi con đường này đáng để làm nhược điểm.
Tôi hy vọng rằng bây giờ bạn có thể bảo vệ bất kỳ bên nào trong cuộc chiến thánh này và biện minh cho phong cách bạn thích. Mã hóa hạnh phúc!
Như mọi khi, bạn có thể đăng ký các hệ thống kiên cường và nhận các bài viết mới qua email nếu bạn chưa thực hiện nó. Bạn cũng có thể tìm thấy tôi trên Twitter hoặc ở một nơi khác-Tôi luôn sẵn lòng trò chuyện :-]
You also can find me on Twitter or somewhere
else – I am always happy to chat :-]
- Phần mềm kiên cường