JSLint 未使用的变量错误
Posted
技术标签:
【中文标题】JSLint 未使用的变量错误【英文标题】:JSLint unused variable error 【发布时间】:2011-12-23 07:25:09 【问题描述】:我创建了一个 javascript 文档,我想让这个 JSlint 有效。
http://pastebin.com/GvZLyNbV
/*jslint browser: true, indent: 2 */
/*global ActiveXObject: true, window: true*/
(function (window)
"use strict";
/**
* ajax class
*
* ez az objektum fogja kezelni az ajax kérelmeket. lényege hogy nagyon
* minimális legyen. nem akarom jobban magyarázni, eléggé bonyolult, mert a
* különböző böngészők különbözően kezelik az ajax hívásokat.
*/
var ajax = window.ajax = ;
ajax.XHR =
getXHR: function ()
var http;
try
http = new XMLHttpRequest();
this.getXHR = function ()
return new XMLHttpRequest();
;
return http;
catch (e)
try
http = new ActiveXObject("MSXML2.XMLHTTP.3.0");
this.getXHR = function ()
return new ActiveXObject("MSXML2.XMLHTTP.3.0");
;
return http;
catch (f)
try
http = new ActiveXObject("MSXML2.XMLHTTP");
this.getXHR = function ()
return new ActiveXObject("MSXML2.XMLHTTP");
;
return http;
catch (g)
try
http = new ActiveXObject("Microsoft.XMLHTTP");
this.getXHR = function ()
return new ActiveXObject("Microsoft.XMLHTTP");
;
return http;
catch (h)
,
call: function (method, uri, callback, postData)
var xhr = this.getXHR();
xhr.onreadystatechange = function ()
if (xhr.readyState === 4 && xhr.status === 200)
if (typeof callback === "function")
callback(xhr);
;
xhr.open(method, uri, true);
if (method === "POST")
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
//xhr.setRequestHeader("Content-length", postData.length);
//xhr.setRequestHeader("Connection", "close");
xhr.send(postData);
else
xhr.send(null);
return xhr;
;
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/**
* periodic object
*
* Ez az osztály kezeli a periodikus hívások egyesítését. Hozzá tudunk adni
* listenereket
* @see ajax.ListenerObj
*
* Az a lényege hogy az összes listenert átnézi és egyesíti a requesteket
* így egy kérelemben egybe elküldi az összes requestet.
*
* @todo Jobban kellene rendezni az osztályt, ne csak így a levegőben lógjon,
* meg majd bele kell venni a benchmark osztályt is meg jobban kell időzíteni.
*
*/
ajax.periodic = ;
ajax.periodic.isListen = false;
ajax.periodic.timer = null;
ajax.periodic.listenDelay = 5000;
ajax.periodic.url = "ajax.php";
ajax.periodic.listeners = [];
/**
* Ezzel a függvénnyel indítjuk el a periodikus hívásokat
*/
ajax.periodic.startListen = function ()
window.clearTimeout(ajax.periodic.timer);
ajax.periodic.isListen = true;
ajax.periodic.listen();
;
/**
* Ezzel a fügvénnyel állítjuk le a periodikus hívásokat
*/
ajax.periodic.stopListen = function ()
window.clearTimeout(ajax.periodic.timer);
ajax.periodic.isListen = false;
;
/**
* Ezzel a fügvénnyel adhatunk új ListenerObj objektumot a periodic osztályhoz
*
* @see ajax.ListenerObj
*/
ajax.periodic.addListener = function (obj)
if (obj instanceof ajax.ListenerObj)
ajax.periodic.listeners.push(obj);
;
/**
* Ezzel a fügvénnyel törölhetünk egy ListenerObj objektumot a periodic
* osztályból
*
* @see ajax.ListenerObj
*/
ajax.periodic.removeListener = function (obj)
var i = ajax.periodic.listeners.indexOf(obj);
if (i >= 0)
ajax.periodic.listeners.splice(i, 1);
;
/**
* Ezzel a fügvénnyel kérdezzük le az össze ListenerObj objektum paramját
*
* @param method : Ez "GET" vagy "POST" lehet
* @param escape : Ez az hogy encodolja-e a tartalmat (default true)
*/
ajax.periodic.getListenersQueries = function (method, escape)
var allQueries = new ajax.QueryCollection(),
i;
escape = (escape === false) ? false : true;
for (i = 0; i < ajax.periodic.listeners.length; i += 1)
if (ajax.periodic.listeners[i].isListen())
allQueries.mergeCollection(ajax.periodic.listeners[i].queries);
return allQueries.queriesToString(method, escape);
;
/**
* Ez a függvény meghíváskor elindul, és periodicc.delay időközönként
* újrahívja magát. Az AJAX válaszban kapott adatot továbbítja a ListenerObj
* objektumoknak.
*/
ajax.periodic.listen = function ()
if (!ajax.periodic.isListen)
return;
var startTime = (new Date()).getTime(),
uri = ajax.periodic.url + "?" + ajax.periodic.getListenersQueries("get"),
postData = ajax.periodic.getListenersQueries("post"),
i;
for (i = 0; i < ajax.periodic.listeners.length; i += 1)
ajax.periodic.listeners[i].setRequest(true);
ajax.XHR.call("POST", uri, function (data, status)
var i, delay;
for (i = 0; i < ajax.periodic.listeners.length; i += 1)
if (ajax.periodic.listeners[i].isRequest() === true)
ajax.periodic.listeners[i].setRequest(false);
ajax.periodic.listeners[i].parse(data);
delay = (new Date()).getTime() - startTime;
ajax.periodic.timer = window.setTimeout(ajax.periodic.listen, ((delay < ajax.periodic.listenDelay) ? ajax.periodic.listenDelay - delay : 0));
, postData);
;
/**
* paraméterben megadott listener egyszer requesteli.
*/
ajax.periodic.request = function (listener, func)
func = (typeof func === "function") ? func : function () ;
ajax.XHR.call("POST", ajax.periodic.url + "?" + listener.queries.queriesToString("GET"), function (data, status)
func(data);
, ajax.listener.queries.queriesToString("POST"));
;
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/**
* ajax.QueryCollection class
*
* Ez az osztály a query paramétereket tárolja el.
*/
ajax.QueryCollection = function ()
var queryArray = [];
this.queryArray = queryArray;
/**
* Query paraméter hozzáadása
*/
this.addQuery = function (method, name, value)
if (!method || !name)
return this;
method = method.toString().toLowerCase();
name = name.toString();
value = (value === undefined) ? "" : value.toString();
var i;
for (i = 0; i < queryArray.length; i += 1)
if (queryArray[i].method === method && queryArray[i].name === name)
queryArray[i].value = value;
return;
//if not found then add a new
queryArray.push(
"method": method,
"name": name,
"value": value
);
;
/**
* Query paraméter törlése
*/
this.removeQuery = function (method, name)
var i;
for (i = 0; i < queryArray.length; i += 1)
if (queryArray[i].method === method && queryArray[i].name === name)
queryArray[i].splice(i, 1);
return;
;
/**
* Két ilyen osztály egyesítése
*/
this.mergeCollection = function (obj)
if (!obj instanceof ajax.QueryCollection)
return;
var i;
for (i = 0; i < obj.queryArray.length; i += 1)
this.addQuery(obj.queryArray[i].method, obj.queryArray[i].name, obj.queryArray[i].value);
;
/*
* Az argumentumban található osztály querijainak törlése ebből az osztályból
*/
this.splitCollection = function (obj)
if (!obj instanceof ajax.QueryCollection)
return;
var i;
for (i = 0; i < obj.queryArray.length; i += 1)
this.removeQuery(obj.queryArray[i].method, obj.queryArray[i].name);
;
/*
* Queryk egyesítése stringbe
*/
this.queriesToString = function (method, escape)
var str = "",
cnt = 0,
i;
escape = (escape === false) ? false : true;
for (i = 0; i < queryArray.length; i += 1)
if (queryArray[i].method === method)
if (cnt !== 0)
str += "&";
cnt += 1;
str += queryArray[i].name;
if (queryArray[i].value !== "")
str += "=";
if (escape === true)
str += encodeURIComponent(queryArray[i].value);
else
str += queryArray[i].value;
return str;
;
;
/*
* ajax.ListenerObj class
*
* Ez az osztály arra való hogy segítségvel csinálhatok listener objektumokat
* amiknek beállíthatok queriket.
*/
ajax.ListenerObj = function ()
var isListen = false,
isRequest = false,
parserFunc = function () ;
this.queries = new ajax.QueryCollection();
this.setListen = function (a)
isListen = (a) ? true : false;
;
this.isListen = function ()
return isListen;
;
this.setRequest = function (a)
isRequest = (a) ? true : false;
;
this.isRequest = function ()
return isRequest;
;
this.setParser = function (a)
if (typeof a === "function")
parserFunc = a;
return this;
;
this.parse = function (data)
parserFunc(data);
;
;
(window));
当我使用 JSLint 进行验证时,我得到了这个错误:
Error:
Unused variable: status 182 'uri', status 203 'GET'
我不明白我应该解决什么问题。使用了uri
变量,'GET'
是字符串常量,不是变量。
所以我完全糊涂了。
【问题讨论】:
像 pastebin 这样的网站可能对您的问题很有用辅助,但请始终在问题本身中包含相关代码。试图帮助您的人不需要点击其他站点,并且外部链接可能会更改/移动/消失,这将使您的问题在未来对其他人完全无用。此外,在本例中,您已链接到 大量 代码示例。您需要花一些时间来解决问题。 我的代码长度为 369 行。包含在问题中真的是一个好习惯吗?@omnosis
: A) 是的,B) 它更好 实践将问题归零,而不是期望人们通读 369 行代码。跨度>
【参考方案1】:
在您的代码中,从第 182 行开始,有一个您传递给 ajax.XHR.call
的函数,它声明了一个您从不使用的变量 status
:
// |-- Function starts here
// V V-- Variable (argument) `status`, never used
ajax.XHR.call("POST", uri, function (data, status)
var i, delay;
for (i = 0; i < ajax.periodic.listeners.length; i += 1)
if (ajax.periodic.listeners[i].isRequest() === true)
ajax.periodic.listeners[i].setRequest(false);
ajax.periodic.listeners[i].parse(data);
delay = (new Date()).getTime() - startTime;
ajax.periodic.timer = window.setTimeout(ajax.periodic.listen, ((delay < ajax.periodic.listenDelay) ? ajax.periodic.listenDelay - delay : 0));
, postData);
您可以通过从函数签名中删除参数来消除错误。或者您可以忽略它,因为记住 JSLint 完全是关于 Douglas Crockford 的编码风格非常重要,这可能是也可能不是您认为适合您自己的编码风格的东西。您还可以查看JSHint,它可以让您更好地控制选项。
【讨论】:
@omnosis:不用担心,很高兴有帮助。 在这种情况下删除参数有效,但并非总是如此。不要忽视警告,它提出了一个很好的问题。为什么我必须命名我不会使用的参数?也许如果他们在 jQuery 上进行 linted,他们会重新考虑在回调签名中包含这么多参数的想法,也许他们会将它们包装在一个对象中。 ajax.error 回调在我想要的唯一一个“异常”之前有 3 个参数。在警告之前我从未考虑过它,现在我会为我编写的每个函数考虑它,我认为我已经为它留下了一个更好的开发人员。 @JasonKostempski:是的,我永远不会指出 jQuery 作为 API 设计的一个很好的例子。 :-) (我也不希望设计师一直使用 lint 工具会更好[他们很可能已经使用了]。)但是几乎所有的设计选择都有利有弊,但事实并非如此总是很明显要注意哪些。在设计 API 时真正考虑到 API 的用户是很好的一点,并且作为那种显然一直在努力改进的工程师而受到赞誉。【参考方案2】:未使用的变量:状态 182 'uri',状态 203 'GET'
表示您在第 182 行和第 203 行有未使用的变量 status
。
【讨论】:
对不起。但我的问题是我使用uri
。这就是问题所在。
问题不在于 uri 或 GET,而在于“状态”。您未使用的变量是“状态”。
噗。我只是感到困惑。试图找出关于uri的问题。我不知道为什么 JSLint 写它。以上是关于JSLint 未使用的变量错误的主要内容,如果未能解决你的问题,请参考以下文章