2012-04-13 40 views
5

Tại sao jslint lại phàn nàn về việc sử dụng hàm này trong hàm được khai báo?Vi phạm nghiêm trọng khi sử dụng 'this' trong chức năng được khai báo, không vi phạm với biểu thức hàm

function navigate() { 
    var id = $(this).attr('id'); 
} 

Cung cấp cho tôi:

#1 Strict violation. 
var id = $(this).attr('id'), // Line 18, Pos 20 

Tuy JSLint không đưa ra khiếu nại về:

var navigate = function() { 
    var id = $(this).attr('id'); 
} 

Tôi đang sử dụng cả hai trong cùng một cách, và cả hai đều làm việc một cách chính xác trong trình duyệt .

view.on('click', navigate); 

FYI, tôi nhận được cảnh báo bằng cách sử dụng event.target thay vào đó, nhưng tôi muốn biết sự khác biệt là gì.

function navigate(event) { 
    var id = $(event.target).attr('id'); // no complaint 
} 
+0

Khi tôi chạy nó thông qua JSLint tôi không nhận được một lỗi trên 'this' tôi có một lỗi trên 'sự kiện' không được sử dụng. –

+0

Vâng tôi đã quên xóa sự kiện trong hai chức năng hàng đầu, tôi chỉ thêm nó vào để giải quyết khiếu nại về 'điều này'. Đã cập nhật câu hỏi, cảm ơn. –

Trả lời

3

Có một cái nhìn tại liên kết này: https://github.com/shichuan/javascript-patterns/blob/master/general-patterns/function-declarations.html

Từ tài liệu tham khảo tuyệt vời này ở đây: http://shichuan.github.com/javascript-patterns/

Những lý do được cung cấp, nhưng tôi không chắc làm thế nào thuyết phục họ là:

  1. Giúp dễ hiểu "chức năng như một đối tượng".
  2. Nó thực thi thói quen bán dấu chấm phẩy tốt.
  3. Không có nhiều hành lý theo truyền thống liên quan đến chức năng và phạm vi.

Lý do "biểu thức hàm được đặt tên" trên trang đó có sức thuyết phục hơn một chút, nhưng vẫn không áp đảo.

Bằng cách này, những người dường như đến từ John Resig (jQuery nổi tiếng), như liên kết ở đây: http://ejohn.org/blog/javascript-as-a-first-language/

+0

Bài viết thú vị từ John Resig, cảm ơn liên kết. Không có gì cụ thể ở đó, đặc biệt là liên quan đến 'this'. Ngoài ra phương thức khai báo hàm cũng có một số lợi ích: 1. Không cần lặp lại tên hàm (trong var ở đầu phạm vi và một lần nữa khi bạn định nghĩa nó) và 2. Bạn không bao giờ chạy vào vấn đề gọi chức năng trước khi nó được xác định vì nó được tự động nâng lên đỉnh của phạm vi hiện tại. –

+0

# 2 là [hoàn toàn] IMOHO vô nghĩa. Tôi có thói quen bán dấu chấm phẩy tốt. Nó bao gồm * không bao gồm dấu chấm phẩy giả ở cuối mỗi dòng *. Các "chính xác" giải pháp, một lần nữa IMOHO, là để * không bao giờ bắt đầu một dòng với một '(' hoặc '[' * như vậy sẽ ngăn chặn ASI từ một dòng trước đó mà không có dấu chấm phẩy (xem vô số SO bài viết về chủ đề) –

+0

Đánh dấu điều này là chính xác cho đến bây giờ ... vẫn thấy nó khá mơ hồ mặc dù. –

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