Câu hỏi Thông báo JSLint: Biến không sử dụng


Tôi có thể làm gì nếu JSLint phàn nàn về "i" là một biến không sử dụng trong một kịch bản như vậy:

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

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

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ụ để cho bạn thấy những gì tôi có ý nghĩa và tôi quan tâm để xem một giải pháp chung, nếu có. Cảm ơn.


76
2017-07-05 13:43


gốc


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 tham số. Nhưng câu hỏi này có lẽ nên được trả lời một cách tổng quát hơn. - Greg
Sẽ rất tuyệt nếu chúng ta có thể làm $.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 để nói với JSLint để bỏ qua _, mặc dù điều đó thực sự tốt đẹp. - David J.


Các câu trả lời:


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

76
2017-07-05 15:16



+1. Điều này làm việc tuyệt vời cho tôi trong một 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
Vì bạn không sử dụng i và bạn đang lặp qua một mảng các đối tượng sử dụng trình lặp của jQuery, bạn có thể sử dụng "this": $.each([{a:0},{a:1},{a:2},{a:3}], function(){ console.log(this.a)}) - Szabi
Đây là cách tốt nhất để làm điều đó! / * jslint unparam: true * / - Foxinni
Xóa hàm :)
unparam không còn được hỗ trợ bởi JSLint. Thay vào đó, nó cung cấp ignore từ khóa được mô tả trong câu trả lời bên dưới. - oyenamit


Tôi nghĩ rằng điều này phải là 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 chỉ đơn giản là trở thành:

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

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


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

Để xoa dịu cả JsLint và 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 bị lỗi trên "không xác định (d)" do không xác định không phải là một hàm. Vì vậy, "undefined! == win.undefined" bỏ qua dòng nếu chúng ta đang ở trong trình duyệt.


23
2017-07-08 14:38



Điều này mới ignore cách ngăn chặn các cảnh báo bị phá vỡ nếu cùng một hàm có nhiều tham số không được sử dụng. - oyenamit
bạn có thể sử dụng (tham số, bỏ qua, bỏ qua1, bỏ qua2, giá trị, bỏ qua3), ít nhất là trên Webstorm dành cho Mac là quảng cáo làm việc ngăn chặn cảnh báo - Paul N


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 có lẽ tệ hơn nếu bạn hỏi tôi.


1
2017-07-05 13:48



chắc chắn tồi tệ hơn ....... - Schroedingers Cat
@Schroedinger - oh yeah, chắc chắn rồi. Nó luôn luôn là một sự cân bằng với JSLint. Bạn chỉ cần quyết định cho chính mình. - nickf
Khắc phục một cảnh báo, gây ra một cảnh báo khác "JS Lint: Sử dụng tham số có tên" :)


Một cách có thể để loại bỏ cảnh báo theo cách khá tự lập tài liệu 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ể nhận được vào tình huống mà bạn đánh dấu một biến là không sử dụng, và bạn vẫn còn sử dụng nó ở đâu đó. Ngoài ra, phương pháp này có thể quá chi tiết, tùy thuộc vào ngữ cảnh.

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


1
2017-07-05 15:55



Điều này có thể thất bại trong thử nghiệm "khối trống" của JSLint. - jokeyrhyme
Tôi cho rằng mục tiêu của JSLint là có một mã sạch hơn. - Julien
Câu trả lời này làm 'công việc', mặc dù tôi khuyên bạn không nên sử dụng nó. Tôi nộp nó dưới "giải pháp là tồi tệ hơn vấn đề." - David J.
Nó sẽ hữu ích hơn cho các độc giả khác nếu các bạn thêm vào một số chi tiết về những gì là xấu về giải pháp này, @superluminary và DavidJames. Tôi không có vấn đề với những người không thích giải pháp này, nhưng thêm một bình luận nói rằng điều đó không giúp ích gì cả. :) - Magnus Hoff
Lời 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ã phi 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 hack, nó không thêm ý nghĩa cho mã, và nó sẽ không già đi. Giải pháp thích hợp là sửa đổi JSLint. - superluminary


Cách sử dụng void để làm rõ 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 được dự kiến ​​sẽ bị ghi đè, nhưng nơi bạn muốn hiển thị chữ ký, hoặc trong mocks, nơi bạn bỏ qua các đối số, nhưng muốn khớp với chữ ký của hàm được mô phỏng.


1
2017-09-13 23:59



sử dụng khoảng trống dường như không vượt qua được JSLint - xorcus
Sử dụng void nguyên nhân Expected 'undefined' and instead saw 'void'. Sử dụng undefined(i, any, other, unused, vars); vượt qua JSLint. - msenni


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


1
2017-11-14 06:38



Đây không phải là một ý tưởng tồi, nhưng nếu bạn tích hợp liên tục và muốn lint tất cả mã trước khi cho phép mã được sáp nhập thì điều này không hoạt động nếu bạn đang xử lý cảnh báo là lỗi.
Như đã đề cập trong điều này trả lời, đổi tên biến chưa sử dụng thành "bỏ qua" 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 đã sẵn sàng (giới hạn: chỉ hỗ trợ một biến không sử dụng trong cùng một hàm) - Emilien


Trong trường hợp cụ thể này của việc chuyển đổi một mảng / đối tượng http://api.jquery.com/jquery.map/ (hoặc là http://api.jquery.com/map/ ?) là một lựa chọn.

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

0
2018-01-30 07:10