2009-10-27 20 views
6

Lấy khuôn khổ jQuery ví dụ, nếu bạn chạy mã như thế này:Các hàm được đặt tên có được đánh giá bằng JavaScript không?

$(document).ready(function init() { foo.bar(); }); 

Các stack trace bạn nhận được trong Firebug sẽ trông như thế này:

init() 
anonymous() 
anonymous([function(), init(), function(), 4 more...], function(), Object name=args) 
anonymous() 
anonymous() 

Như bạn có thể thấy, nó không phải là rất có thể đọc được, bởi vì bạn phải bấm vào từng chức năng để tìm ra nó là gì. Các hàm ẩn danh cũng sẽ hiển thị là (?)() trong trình hồ sơ và chúng có thể dẫn đến lỗi "cannot access optimized closure". Dường như với tôi rằng đây là những lý do tốt để tránh chúng. Sau đó, thực tế là ECMAScript 5 sẽ không dùng arguments.callee ở chế độ nghiêm ngặt, điều này có nghĩa là sẽ không thể tham chiếu các chức năng ẩn danh với nó, làm cho chúng ít tương lai hơn một chút.

Mặt khác, sử dụng tên chức năng có thể dẫn đến sự lặp lại, ví dụ:

var Foo = { 
    bar: function bar() {} 
} 

function Foo() {} 

Foo.prototype.bar = function bar() {} 

Tôi thích hợp trong suy nghĩ rằng sự lặp lại này là hợp lý trong bối cảnh sự tiện lợi gỡ lỗi tên là chức năng cung cấp, và rằng sự phổ biến chức năng ẩn danh trong các khung công tác tốt như jQuery là sự giám sát?

Trả lời

3

Tôi đã tìm thấy câu trả lời cho câu hỏi của mình trong số very informative article này. Thứ nhất, nó chỉ ra rằng tôi đã đúng về chức năng được đặt tên được nhiều hơn mong muốn, nhưng giải pháp không đơn giản như việc thêm định danh cho tất cả các chức năng vô danh. Lý do chính cho việc này là JScript thực hiện các biểu thức hàm theo cách rất bị hỏng.

Thứ hai, có sự phân biệt giữa các câu lệnh và biểu thức hàm. Một hàm ẩn danh chỉ là một biểu thức hàm với số nhận dạng bị bỏ qua, và thêm một định danh (đặt tên nó) sẽ không làm cho nó thành một câu lệnh (ngoại trừ trong JScript, đó là lý do tại sao nó bị hỏng). Điều này có nghĩa là tất cả các câu trả lời khác đều không được đánh dấu.

+2

Rất tiếc, liên kết đến bài viết đó không hoạt động nữa. Tuy nhiên cùng một bài viết có thể được tìm thấy ở đây: http://kangax.github.com/nfe/ – Jan

1

Nhưng đối với tôi các chức năng ẩn danh có thể đọc được nhiều hơn trong mã nguồn, vì tôi chắc chắn chúng chỉ được sử dụng ở đó.

3

Tôi đồng ý có một số nhược điểm nhất định khi sử dụng các phương thức ẩn danh trong JavaScript/EMCAScript. Tuy nhiên, đừng bỏ qua cách sử dụng chúng. Đối với một lớp lót đơn giản mà bạn muốn chuyển sang hàm khác, chúng thường xuất sắc.

+1

Không giống như sử dụng các hàm được đặt tên để thêm nhiều dòng hơn, trừ khi bạn đang sử dụng các tên thực sự, dài và có từ bọc. – slikts

+1

Nó không phải, không, nhưng đôi khi nó rất thuận tiện. Đôi khi chức năng không thực sự CẦN một cái tên. Tại sao cho nó một? –

0

Chức năng ẩn danh rất thuận tiện. Một sửa chữa tốt hơn cho vấn đề này, thay vì đặt tên cho các hàm, sẽ là nếu firebug nói với bạn về dòng nào trong đó tệp mà hàm ẩn danh đã được tạo ra.

init() 
anonymous() // application.js, line 54 
anonymous() // foo.js, line 2 

Và theo dõi ngăn xếp là nơi duy nhất mà các chức năng ẩn danh là một vấn đề.

+0

Tôi đã đặt tên cho ba vấn đề khác với các chức năng ẩn danh và Firebug báo cáo số dòng cho chúng. – slikts

+0

Ghi chú của "imo". –

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