Thông báo JSLint: Các biến không được sử dụng


80

tôi có thể làm gì nếu JSLint phàn nàn về việc "i" là một biến không được sử dụng trong trường hợp như vậy:

var items = "<option selected></option>";
$.each(data, function (i, item) {
    items += "<option value='" + item.Value + "'>" + item.Text + "</option>";
});

(i, item) là thứ tự bắt buộc của các tham số và tôi chỉ sử dụng "item".

Có giải pháp nào khác ngoài việc dung nạp các biến không sử dụng hoặc viết lại $ .each để sử dụng chỉ mục, cả hai giải pháp mà tôi không muốn làm?

Cảm ơn trước.

Cập nhật: Tôi đánh giá cao tất cả các đề xuất nhưng mã này chỉ đơn giản là một ví dụ để bạn thấy ý của tôi và tôi muốn xem một giải pháp chung, nếu có. Cảm ơn.


6
Trong trường hợp cụ thể này this= item( api.jquery.com/jQuery.each ), vì vậy bạn sẽ không phải sử dụng một trong hai tham số. Nhưng câu hỏi này có lẽ nên được trả lời theo một nghĩa chung hơn.
Greg

Nó sẽ rất tốt đẹp nếu chúng ta chỉ có thể làm được$.each(data, function (, item)
oscaralexander

Nhiều người sử dụng _cho một tham số không sử dụng , nhưng tôi không có cách nào để yêu cầu JSLint bỏ qua một cách cụ thể _, mặc dù điều đó thực sự tốt.
David J.

Câu trả lời:


79

Thử:

var items = "<option selected></option>";
/*jslint unparam: true*/
$.each(data, function (i, item) {
    items += "<option value='" + item.Value + "'>" + item.Text + "</option>";
});
/*jslint unparam: false*/  // so that you still get warnings from other functions

+1. Điều này hiệu quả với tôi trong tình huống tương tự và tôi đã có thể đặt nó ngay trước và ngay sau dòng bị ảnh hưởng. Cảm ơn!
Ed Bayiates

4
Kể từ khi bạn không sử dụng i và bạn đang iterating qua một mảng của các đối tượng sử dụng iterator của jQuery, bạn có thể sử dụng "này":$.each([{a:0},{a:1},{a:2},{a:3}], function(){ console.log(this.a)})

3
Đây là cách tốt nhất để làm điều đó! / * jslint unaram: true * /
Foxinni

1
Xóa chức năng :)

2
unparamkhông còn được hỗ trợ bởi JSLint. Thay vào đó, nó cung cấp ignoretừ khóa mới được mô tả trong câu trả lời bên dưới.
oyenamit

24

Tôi nghĩ điều này phải mới trong: http://www.jslint.com/help.html

"JSLint giới thiệu một từ dành riêng mới: bỏ qua"

Vì vậy, ở trên đơn giản trở thành:

$.each(data, function (ignore, item) {

i => bỏ qua ... quá dễ. Phần còn lại của mã có thể được giữ nguyên, trình duyệt hài lòng và JSLint hài lòng


Câu trả lời trước đó (sai):

Để xoa dịu cả JsLint và các trình duyệt tôi cần sử dụng:

function (d, i) {
        if (undefined !== win.undefined) {
            undefined(d);
        }
        return (i);
}

Trình duyệt gặp sự cố trên "undefined (d)" do undefined không phải là một chức năng. Vì vậy, "undefined! == win.undefined" bỏ qua dòng nếu chúng ta đang ở trong một trình duyệt.


14
Đây mới ignorecách đàn áp cảnh báo phá vỡ xuống nếu chức năng tương tự có nhiều hơn một thông số không sử dụng.
oyenamit

bạn có thể sử dụng (tham số, bỏ qua, ignore1, ignore2, giá trị, ignore3), ít nhất là trên Webstorm cho Mac đang làm việc cảnh báo đàn áp quảng cáo
Paul N

1

bạn có thể làm điều này:

var items = "<option selected></option>";
$.each(data, function () {
    var item = arguments[1];
    items += "<option value='" + item.Value + "'>" + item.Text + "</option>";
});

... nhưng điều đó có lẽ còn tệ hơn nếu bạn hỏi tôi.


1
@Schroedinger - chắc chắn rồi. Nó luôn là một sự đánh đổi với JSLint. Bạn chỉ phải quyết định cho chính mình.
nickf

8
Sửa chữa một cảnh báo, nguyên nhân khác "JS Lint: Sử dụng một tham số có tên là" :)

1

Một cách có thể để loại bỏ cảnh báo theo cách khá tự ghi lại là làm cho biến không sử dụng được sử dụng, như sau:

// Utility function in project scope:
function unusedVariables(/* Put all your deliberately unused variables here */) {
    // pass
}

// And then, later:
var items = "<option selected></option>";
$.each(data, function (i, item) {
    unusedVariables(i); //< This is the new and magical line
    items += "<option value='" + item.Value + "'>" + item.Text + "</option>";
});

Tất nhiên, bây giờ bạn có thể gặp phải trường hợp bạn đánh dấu một biến là không sử dụng, và bạn vẫn sử dụng nó ở đâu đó. Ngoài ra, phương pháp này có thể quá dài dòng, tùy thuộc vào ngữ cảnh.

Phương pháp này có ưu điểm là nó chính xác. Sử dụng /*jslint unparam*/có thể quá rộng.


4
Điều này có thể không thành công thử nghiệm "khối trống" của JSLint.
jokeyrhyme

4
Câu trả lời này 'hoạt động', mặc dù tôi khuyên bạn không nên sử dụng nó. Tôi gửi nó dưới "giải pháp còn tệ hơn vấn đề."
David J.

1
Sẽ hữu ích hơn cho những độc giả khác nếu các bạn thêm một số chi tiết về những điểm không tốt trong giải pháp này, @superluminary và DavidJames. Tôi không gặp vấn đề gì với việc mọi người không thích giải pháp này, nhưng việc thêm một nhận xét nói rằng điều đó không giúp ích được cho ai cả. :)
Magnus Hoff

6
Xin lỗi Magnus, bình luận đã bị xóa. Lý do tôi không thích giải pháp này là vì bạn đang thêm mã không có ngữ nghĩa chỉ nhằm mục đích đánh lừa một phiên bản cụ thể của trình xác thực cụ thể để chuyển mã của bạn. Đó là một cuộc tấn công, nó không thêm ý nghĩa cho mã và nó sẽ không lâu dài. Giải pháp thích hợp là sửa đổi JSLint.
siêu thường ngày

@superluminary Cảm ơn bạn đã xây dựng các Điều :)
Magnus Hoff

1

Làm thế nào về việc sử dụng voidđể làm cho rõ ràng rằng bạn đang cố ý không sử dụng biến?

$.each(data, function (i, item, any, other, unused, vars) {
  void(i, any, other, unused, vars);
  items += "<option value='" + item.Value + "'>" + item.Text + "</option>";
});

Điều này cũng hữu ích trong các hàm trừu tượng dự kiến ​​sẽ bị ghi đè, nhưng nơi bạn muốn hiển thị chữ ký, hoặc trong mô phỏng, nơi bạn đang bỏ qua các đối số, nhưng muốn khớp với chữ ký của hàm bị chế nhạo.


3
sử dụng void dường như không vượt qua JSLint
xorcus

Sử dụng voidnguyên nhân Expected 'undefined' and instead saw 'void'. Sử dụng undefined(i, any, other, unused, vars);thông qua JSLint mặc dù.
msenni

1

Tôi đổi tên "i" là "chưa sử dụng". Nó vẫn để lại lỗi rõ ràng, nhưng tôi nhìn thấy nó trong danh sách và biết tôi đã "kiểm tra" lỗi đó và ổn với nó.


Đây không phải là một ý tưởng tồi, nhưng nếu bạn thực hiện tích hợp liên tục và muốn tách tất cả mã trước khi cho phép mã được hợp nhất thì điều này sẽ không hoạt động nếu bạn đang coi cảnh báo là lỗi.

1
Như đã đề cập trong câu trả lời này , hãy đổi tên biến không sử dụng thành "ignore" và nó sẽ được xác nhận bởi JSLint. Vì vậy, "bỏ qua" thay vì "không sử dụng", và bạn đã cài đặt xong (giới hạn: hỗ trợ chỉ có một biến không sử dụng trong các chức năng tương tự)
Emilien


0

Nếu hàm có nhiều hơn một tham số không được sử dụng, bạn có thể sử dụng "bỏ qua" như sau:

function (ignoreFoo, ignoreBar, baz) {
}

Nó phải đơn giản bắt đầu bằng từ dành riêng "ignore" (ignore, ignoreFoo, ignoreBar, ...).


Điều này về cơ bản giống với câu trả lời của PuZZleDucK . Nếu bạn thêm câu trả lời khi đã có một số câu trả lời, và đặc biệt nếu chúng cũ hơn nhiều và đã được ủng hộ, hãy đảm bảo rằng bạn không lặp lại câu trả lời khác hoặc nếu có sự khác biệt, vui lòng trích dẫn câu trả lời kia một cách rõ ràng và chỉ ra sự khác biệt rõ ràng. Cảm ơn bạn!
Fabio nói Hãy phục hồi Monica vào

2
Với đoạn mã sau (3 biến không sử dụng) chỉ là người đầu tiên "bỏ qua" đi xác nhận JSLint, hai tham số cuối cùng kích hoạt "không được sử dụng 'ignoreOne'" và "không sử dụng 'ignoreTwo'"videos.forEach(function (ignore, i, ignoreOne, ignoreTwo)
Emilien

'ignoreInterval' được khai báo nhưng giá trị của nó không bao giờ được đọc. Bây giờ tôi gặp một lỗi dài hơn :(
noob7
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.