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 未使用的变量错误的主要内容,如果未能解决你的问题,请参考以下文章

未声明 Javascript 警报中的 JSLint 混淆

jslint4java 容忍未使用的变量

如何处理js文件eslint错误中未使用的变量?

我应该担心“未定义窗口”JSLint 严格模式错误吗?

如何告诉 JSLint / JSHint 已经定义了哪些全局变量

在 Sublime Text 2 中隐藏不必要的 JSLint 警告