2010-05-22 27 views
14

Tôi gặp lỗi này và không biết nguyên nhân có thể là gì. Bất kỳ ý tưởng?Báo cáo lỗi JSLint - Có vấn đề gì với điều này?

Sự cố ở dòng 2127 ký tự 18: Xấu trong biến thể thao. cho (môn thể thao trong sugested_sports)

   // make array 
     var sugested_sports = data.split(","); 

      // pre build DIV 
     var sporty_items = ''; 
     for (sport in sugested_sports) 
     { 
      if (sugested_sports.hasOwnProperty(sport)) { 
       sporty_items += '<a href="#'+identifier[1]+'">'+sugested_sports[sport]+'</a>'; 
      } 
     } 
      // insert DIV 
     DIVsuggestions.html(sporty_items); 

thx rất nhiều.

+5

JSLint có thể không gợi ý cho bạn điều này, nhưng tôi sẽ, để * lặp * đối tượng mảng (hoặc đối tượng giống mảng), tôi luôn khuyên bạn nên sử dụng vòng lặp 'for' đơn giản, câu lệnh' for-in' được sử dụng để * liệt kê các thuộc tính của đối tượng, với câu lệnh này, ngay cả khi bạn sử dụng kiểm tra 'hasOwnProperty' để tránh liệt kê các thuộc tính trên chuỗi nguyên mẫu, thứ tự lặp lại là * không được bảo đảm * bởi spec, nó có thể tùy ý, vì vậy vòng lặp có thể không truy cập các phần tử theo thứ tự số. Xem thêm: [Enumeration Vs. Iteration] (http://bit.ly/9GPWDY) – CMS

+0

@CMS liên kết đó bị hỏng, nhờ mẹo mặc dù tôi cũng gặp vấn đề này. – Jordan

+0

@Jordan, trang đã được lưu trữ bởi archive.org, bạn có thể xem trang [tại đây] (http://web.archive.org/web/20101213150231/http://dhtmlkitchen.com/?category=/JavaScript/&date = 2007/10/21/& entry = Iteration-Enumeration-Primitives-and-Objects). – CMS

Trả lời

19

Hãy thử

var sport; 
for (sport in sugested_sports) 

này sẽ chăm sóc của các khai báo biến mất và đặt nó bên ngoài vòng lặp for (xem jsLint error "Cannot set property 'first' of undefined").

+0

thx, cách ngu ngốc ;-) – Hans

+6

Khai báo var ở đây sẽ gây ra lỗi jslint khác. Vars phải được khai báo ở đầu phạm vi theo jslint tức là phạm vi toàn cầu hoặc chức năng. –

+4

Nếu bạn chú ý đến JSLint, đó là sự thật. Nếu bạn không, nó không quan trọng. – Pointy

17

Câu trả lời của Pointy có lẽ là câu trả lời mà bạn đang phàn nàn.


Theo nguyên tắc chung, bạn nên cẩn thận khi sử dụng for (... in ...). Mọi người thường nhầm lẫn cấu trúc này với foreach từ C# hoặc các khái niệm tương tự khác bằng các ngôn ngữ khác, trong khi thực tế nó không liên quan. Cấu trúc javascript for in lặp lại mọi thành viên của đối tượng - thay vì chỉ các giá trị trong một bộ sưu tập - bao gồm các phương thức và thuộc tính. Hành vi này thường có thể dẫn đến các tác dụng phụ không mong muốn nếu bạn không biết nó hoạt động như thế nào trước.

Ví dụ:

x = ['one', 'two']; 
for (var value in x) { 
    alert(value); 
} 

Đó mang lại hai cảnh báo, các contaning đầu tiên 0 và thứ hai 1, đáng chú ý là chỉ số của bộ sưu tập.

Nếu chúng ta thay đổi điều đó lên một chút:

x = ['one', 'two']; 
x.method = function() {}; 
for (var value in x) { 
    alert(value); 
} 

Chúng tôi kết thúc với ba cảnh báo thời gian này, 0, 1, và method. Đây là hành vi bất ngờ mà tôi đang đề cập đến. Thật tuyệt khi sử dụng in nếu bạn biết nó làm gì, nhưng tôi đã thấy nó bắt được nhiều người hơn một lần.

Các công trình sau đây với cả hai ví dụ:

x = ['one', 'two']; 
for (var i = 0; i < x.length; i++) { 
    alert(i); 
} 
+0

+1 Không thể đồng ý nhiều hơn, ngoài ra, thứ tự lặp lại không được đảm bảo bởi [đặc tả ngôn ngữ] (http://bclary.com/2004/11/07/#a-12.6.4), các thuộc tính (mảng chỉ mục) có thể không được truy cập theo thứ tự số, và cũng có thể, nếu đối tượng 'Array.prototype' được mở rộng (như [một số thư viện] (http://mootools.net/docs/core/Native/Array) vẫn làm), những thuộc tính đó cũng sẽ được liệt kê ... – CMS

+2

+1 đây phải là câu trả lời được chấp nhận – NimChimpsky

2
var sugested_sports = data.split(","), 
    sport, 
    sport_items = ''; 

    for (sport in sugested_sports) 
    { 
     // 
    } 
3

Tất cả các lỗi có nghĩa là trong JSHint/JSLint là bạn không tuyên bố chìa khóa của bạn/iterator biến. Như @Christopher suggests, JSLint muốn bạn phải khai báo nó ở phía trên của phạm vi của nó (google JavaScript hoisting để biết thêm về treo, like this link):

/*global data, identifier, DIVsuggestions */ 
// We'll pretend all of the above were passed in from a function's parameters 
// by using JSLint's "global" keyword -- now you can paste this code into 
// jslint.com and have it pass muster. 

// make array 
var sugested_sports = data.split(","), 
    sporty_items = '', // pre build DIV 
    sport; // <<<< **** DECLARE YOUR "KEY" HERE **** 

for (sport in sugested_sports) 
{ 
    if (sugested_sports.hasOwnProperty(sport)) { 
     sporty_items += '<a href="#'+identifier[1]+'">' 
      +sugested_sports[sport]+'</a>'; 
    } 
} 
// insert DIV 
DIVsuggestions.html(sporty_items); 

này bad for in variable lỗi ở đây giảm xuống còn giống như một lỗi 'sport' was used before it was defined nơi khác.


EDIT: Nó đáng nói rằng nếu for bạn đang ở trong một chức năng nội bộ, bạn cần phải khai báo biến for in của bạn trong bối cảnh đó tương tự. JSLint sẽ khiếu nại nếu bạn khai báo for in trong ngữ cảnh gốc.

Ví dụ:

function spam(d) 
{ 
    var fnTest, row; // `row` is defined "too early" 

    fnTest = function (data) { 
     for (row in data) 
     { 
      if (data.hasOwnProperty(row)) 
      { 
       console.log(data.row); 
      } 
     } 
    }; 

    fnTest(d); 
} 

Để thực hiện những điều hạnh phúc, di chuyển row vào chức năng nội bộ. Mặc dù về mặt kỹ thuật vẫn còn trong phạm vi, JSLint không thích "superscope" đã được sử dụng trước đó.

function spam(d) 
{ 
    var fnTest; 

    fnTest = function (data) { 
     var row; // and JSLint is happy! ;^D 
     for (row in data) 
     { 
      if (data.hasOwnProperty(row)) 
      { 
       console.log(data.row); 
      } 
     } 
    }; 

    fnTest(d); 
} 


Bằng cách này, mối quan tâm của James được bao phủ bởi hasOwnProperty séc OP đã chèn vào. Đi ra kiểm tra đó, và JSLint sẽ khiếu nại, "Cơ thể của một trong nên được gói trong một tuyên bố nếu để lọc các thuộc tính không mong muốn từ nguyên mẫu". Here's a little more on hasOwnProperty with for... in, if you're interested.

+0

Kẻ bỏ phiếu ẩn danh muốn bình luận? Tôi không thể sửa chữa mối quan tâm của bạn mà không có một số thông tin (và câu trả lời này thực sự là những gì JSLint đang làm ở đây, vì vậy tôi tò mò). – ruffin

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