Hướng dẫn is it bad practice to nest functions in javascript? - thực hành không tốt để lồng các chức năng trong javascript?

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?

Lựa chọn khó khăn

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?

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 onSuccessmultiply0 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 onSuccessmultiply0 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

Có tốt không khi có các chức năng lồng nhau?

Một hàm lồng nhau có thể truy cập các hàm, biến, hằng số, loại, lớp, v.v. khác trong cùng một phạm vi hoặc trong bất kỳ phạm vi bao quanh nào, mà không chuyển tham số rõ ràng, điều này đơn giản hóa rất nhiều dữ liệu vào và ra khỏi hàm lồng nhau. Điều này thường được phép cho cả đọc và viết.greatly simplifies passing data into and out of the nested function. This is typically allowed for both reading and writing.

Có phải thực hành tốt để xác định một chức năng bên trong một chức năng?

Thực sự tốt khi khai báo một chức năng bên trong một chức năng khác.Đây là những nhà trang trí tạo ra đặc biệt hữu ích.Tuy nhiên, theo nguyên tắc thông thường, nếu hàm này phức tạp [hơn 10 dòng], có thể là một ý tưởng tốt hơn để khai báo nó ở cấp độ mô -đun.. This is specially useful creating decorators. However, as a rule of thumb, if the function is complex [more than 10 lines] it might be a better idea to declare it on the module level.

Có thể làm tổ chức năng không?

Hàm lồng nhau là một hàm hoàn toàn chứa trong hàm cha.Bất kỳ chức năng nào trong một tệp chương trình có thể bao gồm một chức năng lồng nhau.Sự khác biệt chính giữa các chức năng lồng nhau và các loại chức năng khác là chúng có thể truy cập và sửa đổi các biến được xác định trong các chức năng cha mẹ của chúng.Any function in a program file can include a nested function. The primary difference between nested functions and other types of functions is that they can access and modify variables that are defined in their parent functions.

Có tệ khi gọi một hàm bên trong một hàm không?

Nói chung, hoàn toàn không có gì sai khi gọi một hàm bên trong một hàm.there's absolutely nothing wrong with calling a function inside a function.

Bài Viết Liên Quan

Chủ Đề