2010-08-11 43 views
22

Tôi đã đọc rằng sử dụng các chức năng ẩn danh trong javascript là thực hành không tốt, bởi vì nó có thể làm gỡ lỗi một nỗi đau, nhưng tôi đã không thấy điều này cho bản thân mình. Có phải các hàm ẩn danh trong JavaScript thực sự không đúng và nếu có thì tại sao?Các chức năng ẩn danh có phải là một thực tế không tốt trong JavaScript không?

+0

Chức năng ẩn danh/lambda là một tính năng cốt lõi của lập trình hàm. Bạn có thể tìm hiểu thêm về điều này tại đây: http://www.youtube.com/results?search_query=cs61a&aq=f – cbednarski

+0

Công cụ dành cho nhà phát triển và chiến lược xây dựng/mô-đun đã trở thành một cách _long_ kể từ năm 2010. Chrome/WebKit thực sự tốt, FireBug là như vậy nhưng đầy đủ (và đặt tên cho biểu thức hàm cũng có thể giúp trực quan). Dù sao, xem xét số lần tuyệt đối mà họ sử dụng thì đây là một tiên đề đáng ngờ, có thể gắn với mã "quá thông minh" và khó theo dõi/gỡ lỗi để bắt đầu .. bởi vì tôi chưa bao giờ cảm thấy đau đớn mã _my_ ;-) – user2864740

Trả lời

12

Không, các chức năng ẩn danh được sử dụng khắp nơi trong JavaScript trên web. Nó có thể làm cho việc gỡ lỗi khó hơn một chút, nhưng không đủ gần để nói rằng chúng không nên được sử dụng.

Ví dụ: JQuery sử dụng rộng rãi chúng.

Có rất nhiều lần khi bạn muốn sử dụng chúng trên các hàm được khai báo chính thức, chẳng hạn như khi bạn muốn giới hạn phạm vi của chúng.

+6

Trên thực tế, đây là một lý do tôi đã ngừng sử dụng jQuery. Nó luôn mất nhiều thời gian hơn tôi nghĩ là hợp lý để xác định xem một lỗi có phải là lỗi cú pháp trong mã của tôi hay không, một lỗi logic trong mã của tôi, hoặc một cái gì đó sai với chính jQuery. Bạn phải thừa nhận, một cuộc gọi ngăn xếp của các chức năng vô danh không làm cho những điều như terribly rõ ràng trong nháy mắt là một trong những chức năng được đặt tên không. – Kev

+6

Bạn luôn có thể sử dụng [biểu thức hàm được đặt tên] (http://yura.thinkweb2.com/named-function-expressions/#named-expr). –

7

Tôi sẽ nói ngược lại, lambdas (bí danh) làm cho một số biểu thức gọn gàng hơn nhiều. Nếu bạn đang ràng buộc nhiều trình xử lý sự kiện cho nhiều sự kiện, nó sẽ là tẻ nhạt cho một tên hàm cho mỗi và mọi trình xử lý sự kiện, ví dụ.

Sẽ hữu ích hơn và tiết kiệm thời gian hơn là không, ngay cả khi nó làm cho việc gỡ lỗi khó hơn một chút nhưng tôi hiếm khi đấu tranh với gỡ lỗi vì một hàm ẩn danh. Và bạn nên sử dụng JSLint để làm cho cuộc sống của bạn dễ dàng hơn khi viết mã.

5

Chắc chắn không, chức năng lambda được sử dụng trên tất cả các địa điểm, hầu như mọi nơi.

+16

Chỉ vì một cái gì đó là _common_ không có nghĩa là nó _correct_. Có thể không có gì sai khi sử dụng các hàm ẩn danh, nhưng nói, "Mọi người làm điều đó" không cấu thành một đối số hợp lệ. –

+0

sâu lồng nhau là tất cả các nơi, nhưng nó hoàn toàn sai –

-3

Biểu thức hàm ẩn danh là thực hiện tốt nhất thực hành bằng JavaScript.

+3

Yêu cầu bị từ chối do thiếu sự hỗ trợ. – user2864740

+4

Bị bỏ qua do thiếu WHY. Cũng vì thực hành * phổ biến * không nhất thiết phải là * thực hành tốt nhất *. –

4

Chỉ vì mọi người sử dụng chúng không làm cho họ thực hành tốt (mọi người đều nhớ sử dụng phần tử bảng để bố cục?). Nhưng, chúng tuyệt vời vì chúng có thể giúp làm rõ và đơn giản hóa mã của bạn, mang đến ít cơ hội hơn cho một điều gì đó không ổn.

Nhưng, các chức năng ẩn danh không quá phức tạp nên việc gỡ lỗi trở nên khó khăn với chúng. Trong trường hợp đó, có lẽ tốt hơn là tạo một chức năng mới.

+3

Bạn luôn có thể sử dụng [biểu thức hàm được đặt tên] (http://yura.thinkweb2.com/named-function-expressions/#named-expr). –

+3

+1 cho mã lemming –

+1

@MarcelKorpel: Liên kết mà bạn cung cấp đã chết, nhưng tôi cho rằng bạn có thể tùy chọn thêm tên vào chức năng ẩn danh của bạn (làm cho nó không còn ẩn danh) như thế này: 'var fAnonymous = (function nonAnon () {}); '. Điều này chắc chắn có thể giúp gỡ lỗi. – palswim

8

Tôi sẽ đi ngược dòng chảy một chút ở đây và làm cho trường hợp các chức năng ẩn danh thực sự là thực hành xấu mặc dù chúng được sử dụng rộng rãi.

1) Không thể sử dụng lại chức năng ẩn danh.

2) Các hàm ẩn danh, theo định nghĩa, không có tên và do đó không mô tả những gì chúng làm. Mà là để nói rằng mã không phải là tự tài liệu.

3) Các hàm ẩn danh không thể được kiểm tra riêng biệt với khung kiểm tra đơn vị.

4) Cá nhân tôi nghĩ rằng họ làm cho mã khó đọc và gỡ lỗi hơn. Mặc dù trải nghiệm của bạn có thể thay đổi.

Tôi nghĩ có những tình huống mà một chức năng ẩn danh là lựa chọn tốt nhất và là quy tắc chung để tránh những nhược điểm trên, tôi hầu như luôn đặt tên cho các chức năng của mình.

+2

1) Có thể sử dụng lại các hàm và đóng ẩn danh, mọi hàm là giá trị và có thể được gán cho một biến hoặc được cung cấp dưới dạng đối số hàm - nó chỉ là vấn đề phơi bày đối tượng hàm ở cấp độ/phạm vi phù hợp; 2) Các hàm ẩn danh (hoặc các biểu thức hàm) _can_ được đặt tên rõ ràng nhưng là "ẩn danh" trong ngữ cảnh; 3) Phụ thuộc vào những gì được kiểm tra, cách nó được kiểm tra, và cách các đối tượng chức năng được tiếp xúc; 4) Đóng cửa/lambdas _can_ bị lạm dụng trong các trường hợp "quá thông minh", nhưng các coder _terrible là coders_ khủng khiếp, ngay cả với các câu lệnh mã thủ tục tầm thường nhất .. – user2864740

+0

Tôi bối rối bởi những gì bạn nói ở đây. Nếu bạn đặt tên cho một hàm và gán nó cho một biến không phải là định nghĩa không phải là một hàm ẩn danh? Bạn có thể đưa ra một ví dụ về ẩn danh với một cái tên? – bhspencer

+0

Vấn đề là thuật ngữ "vô danh" chức năng là một lời nói dối. Thuật ngữ thực phải là * biểu thức hàm * hoặc * đóng cửa * hoặc thậm chí * lambda * (điều này khác với câu lệnh hàm "cấp cao nhất" hoặc "phương thức"). Bởi vì làm thế nào người ta có thể sử dụng một "vô danh" chức năng (trừ một IIFE) mà không có * một số * tên cho nó? – user2864740

0

Đây là giao diện điều khiển trình duyệt của tôi:

// Bad 
poopy = function(){} 
// function(){} 
groupy = poopy; 
// function(){} 

// Good 
droopy = function loopy(){}; 
// function loopy(){} 
floupy = droopy; 
// function loopy(){} 

Hãy tưởng tượng bạn đang gỡ lỗi một cái gì đó và bạn có một tên hàm gọi groupy. Bạn nhập tên của nó để có thêm thông tin về nó.Nếu chức năng đó đã được thiết lập như trong phần xấu, bạn không có ý tưởng về việc khai báo ban đầu là gì. Tuy nhiên, nếu bạn định nghĩa tên hàm của bạn, như trong phần Tốt, thì bạn sẽ luôn có một dấu vết của tên hàm ban đầu.

Các vấn đề liên quan