2011-10-07 30 views
95

Tôi nghĩ rằng đây có thể là một bản sao của Strict Violation using this keyword and revealing module patternTại sao JSHINT phàn nàn rằng đây là vi phạm nghiêm trọng?

tôi có mã này:

function gotoPage(s){ 
    if(s<=this.d&&s>0){this.g=s; this.page((s-1)*this.p.size);} 
} 

function pageChange(event, sorter) { 
    var dd = event.currentTarget; 
    gotoPage.call(sorter, dd[dd.selectedIndex].value); 
} 

Và JSHINT (JSLint) được phàn nàn. Nó nói "Vi phạm nghiêm ngặt". cho dòng nhấn mạnh:

enter image description here

là sử dụng của tôi Function.call() và sau đó tham khảo các ví dụ, bằng cách nào đó không phù hợp?

Đây có phải là kiểu xấu không?

+0

Google có chỉ nói "Vi phạm nghiêm ngặt" mà không có bất kỳ thông báo lỗi chi tiết nào không? – stivlo

+0

Tôi không thể tạo lại sự cố, tôi đã chạy mã thông qua JSHint và JSLint và dường như không có bất kỳ điều gì. –

+50

Lưu ý rằng điều này sẽ dễ chẩn đoán hơn nếu bạn không cố nhồi nhét nó vào một lớp lót vô lý: P. – Domenic

Trả lời

121

JSHint nói "Có thể vi phạm nghiêm ngặt" vì bạn đang sử dụng this bên trong cái gì đó, theo như nó có thể nói, không phải là một phương pháp.

Ở chế độ không nghiêm ngặt, gọi gotoPage(5) sẽ ràng buộc this với đối tượng chung (window trong trình duyệt). Ở chế độ nghiêm ngặt, this sẽ là undefined và bạn sẽ gặp rắc rối.

Có lẽ, bạn muốn gọi hàm này với ngữ cảnh this bị ràng buộc, ví dụ: gotoPage.bind(myObj)(5) hoặc gotoPage.call(myObj, 5). Nếu vậy, bạn có thể bỏ qua JSHint, vì bạn sẽ không tạo ra bất kỳ lỗi nào. Nhưng, nó nói với bạn rằng mã của bạn là không rõ ràng cho bất cứ ai đọc nó, bởi vì sử dụng this bên trong của một cái gì đó mà không rõ ràng là một phương pháp khá khó hiểu. Sẽ tốt hơn nếu chỉ truyền đối tượng dưới dạng tham số:

function gotoPage(sorter, s) { 
    if (s <= sorter.d && s > 0) { 
     sorter.g = s; 

     sorter.page((s - 1) * sorter.p.size); 
    } 
} 

function pageChange(event, sorter) { 
    var dd = event.currentTarget; 
    gotoPage(sorter, dd[dd.selectedIndex].value); 
} 
+2

Bạn có lẽ đúng là khiếu nại của nó là hàm không được định nghĩa * một cách rõ ràng * làm phương thức.Có vẻ ngớ ngẩn cho JSLint/Gợi ý gọi nó là * "Vi phạm nghiêm ngặt" *. – user113716

+0

Trong giao diện web và trong phiên bản mới nhất, nó gọi nó là "_possible_ vi phạm nghiêm ngặt". – Domenic

+12

Mặc dù vậy, tôi nghĩ rằng họ đang có một chút gây hiểu lầm trong mô tả. Ngay cả khi 'this' này kết thúc bằng' undefined', thì vấn đề * thực tế * không chỉ là một vi phạm * chế độ nghiêm ngặt *. Họ sẽ làm tốt hơn để đưa ra một cảnh báo nói rằng 'this' có thể là' undefined' khi ở "chế độ nghiêm ngặt", dẫn đến một 'TypeError' (hoặc một cái gì đó). – user113716

91

Tôi đã có thông báo này cho một chức năng không bắt đầu bằng chữ hoa.

"use strict"; 

// ---> strict violation 
function something() { 
    this.test = ""; 
} 


// ---> just fine (note the capital S in Something) 
function Something() { 
    this.test = ""; 
} 
+27

Tôi sẽ lưu ý rằng jshint có thể giả định, do quy ước, rằng 'Something' là một hàm tạo do vốn S và nên được gọi bằng cách sử dụng 'mới'. Làm như vậy định nghĩa 'this' là một đối tượng mới dựa trên' Something.prototype '. Rất có thể do giả định rằng nó không làm tăng cảnh báo vi phạm nghiêm ngặt có thể xảy ra. –

+4

Tôi có lỗi này trên một nhà cung cấp AngularJS, do đó tên phương pháp trường hợp lạc đà phía trên được mong đợi và tôi có trường hợp lạc đà thấp hơn. Đã sửa. – Deminetix

+0

Tôi đã có vấn đề tương tự, khi có một tên chức năng chỉ chữ thường, đổi tên bằng cách sử dụng một Thủ đô. – GibboK

9

Nếu bạn khai báo hàm thay vì sử dụng khai báo hàm chuẩn, jshint sẽ không gắn cờ điều này là vi phạm nghiêm ngặt. Vì vậy, bạn có thể làm như sau -

var gotoPage = function (s){ 
    if(s<=this.d&&s>0){this.g=s; this.page((s-1)*this.p.size);} 
}; 


var pageChange = function (event, sorter) { 
    var dd = event.currentTarget; 
    gotoPage.call(sorter, dd[dd.selectedIndex].value); 
}; 
0

Nếu bạn đang cố gắng để thực hiện một phương pháp, bạn có thể muốn gán cho nguyên mẫu thay vì:

ExampleClassName.protytpe.gotoPage = function gotoPage(s){ 
    // code using this 
}; 

JSHint sẽ không cảnh báo khi chức năng là được chỉ định.

+0

Vẫn chưa đủ tốt. 'ClassName.prototype.myMethod = myMethod;', sau đó được định nghĩa phương thức bên dưới. Bạn vẫn nhận được một lỗi mặc dù myMethod bị ràng buộc chính xác. – Jefftopia

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