JSLint:意外的“为”。意外的'var'

Posted

技术标签:

【中文标题】JSLint:意外的“为”。意外的\'var\'【英文标题】:JSLint: Unexpected 'for'. Unexpected 'var'JSLint:意外的“为”。意外的'var' 【发布时间】:2016-05-21 12:40:13 【问题描述】:

我在 *** 中搜索并尝试了其他建议。 不幸的是,答案对我不起作用。他们建议使用“foreach”而不是“for”,但我怎么能......如果我只想迭代 50 次? :

好吧,我只是粘贴代码,让我们看看是否有好心人可以帮助我。

JSLint 无法完成。

意外的“为”。 for (var i=1;i 第6行第8列

意外的“变量”。 for (var i=1;i 第 6 行第 13 列

    "use strict";

    var campo = [];
    var ronda = 0;

    // Llenamos el campo de 50 humanos/maquinas/extraterrestres = 150 jugadores
    for (var i=1;i<=50;i+=1)
        campo.push(new Human("h"+i));
        campo.push(new Machine("m"+i));
        campo.push(new Alien("e"+i));
    

    // Array.prototype.suffle para barajar el Array
    Array.prototype.shuffle = function() 
        var input = this;

        for (var i=input.length-1;i>=0;i-=1)
            var randomIndex = Math.floor(Math.random()*(i+1));
            var itemAtIndex = input[randomIndex];

            input[randomIndex]=input[i];
            input[i] = itemAtIndex;
        
    ;

    // Barajamos el Array campo
    campo.shuffle();

    // Comprobamos que quedan más de 1 jugador por ronda
    while (campo.length>1) 
        console.log("Iniciando ronda: " + ++ronda);
        console.log(campo.length + " jugadores luchando.");
        // Recorremos el campo, y luchamos

        var muertos = 0;

        for (var i=0; i<campo.length-1; i+=2)
            // Caso de numero impar de jugadores:
            // Por ejemplo cuando solo quedan 3 jugadores. Pelean 1 vs 2. El 3 se libra.
            // - Si siguen vivos y aguantan otra ronda, se barajan las posiciones otra vez y
            //  vuelven a pelear dos. Y el nuevo tercero no pelea.
            // - Si uno de los dos muere, en la siguiente ronda ya solo quedan 2, y pelean normal.

            campo[i].fight(campo[(i+1)]);
            // # descomentar solo la siguiente linea para hacer comprobaciones #
            // console.log("["+ campo[i].username + "] VS ["+ campo[(i+1)].username + "]");
            if (campo[i].health<=0) 
                console.log("El " + campo[i].constructor.name + " llamado " + campo[i].showName() + " ha sido asesinado :<");
                var fallecido = campo.splice(i, 1);

                // # descomentar solo la siguiente linea para hacer comprobaciones #
                //console.log(fallecido[0]);
                i--; // como el array se hace pequeño, hay que corregir el error para que no se salte jugadores
                muertos++;
             else 
                if (campo[(i+1)].health<=0) 
                    console.log("El " + campo[(i+1)].constructor.name + " llamado " + campo[(i+1)].showName() + " ha sido asesinado :<");
                    var fallecido = campo.splice((i+1), 1);

                    // # descomentar solo la siguiente linea para hacer comprobaciones #
                    // console.log(fallecido[0]);
                    i--; // como el array se hace pequeño, hay que corregir el error para que no se salte jugadores
                    muertos++;
                
                else 
                    // # descomentar solo la siguiente linea para hacer comprobaciones #
                    // console.log("Siguen vivos");
                
            
        

        console.log("Fin de ronda!")
        if (muertos === 1) 
            console.log("Ha muerto " + muertos + " jugador.");
         else 
            console.log("Han muerto " + muertos + " jugadores.");
        

        // Al final de la ronda barajamos de nuevo
        campo.shuffle();
   

    if (campo.length === 1) 
        console.log("Vaya!! Ha sido una memorable batalla!");
        console.log("Después de tantos bits derramados y de " + ronda + " rondas... el jugador '" + campo[0].constructor.name + "' llamado '" + campo[0].showName() + "' se ha alzado con la victoria!!");
    

代码中还有一些其他的 for,但似乎停在第一个。 先感谢您! 忘了说,代码完美。但我只是用 JSLint 验证它,在 JSLint 中“容忍”警告也不起作用。

【问题讨论】:

这只是 Crockford 的愚蠢,再次告诉你 for 循环永远不应该被使用。我会忽略它。 这个问题表明有一个选项可以忽略这个警告“容忍”。 ***.com/questions/30518554/jslint-unexpected-for 是的,忽略它应该是最好的......但我只是想真正学习如何处理这个问题。我知道这个“for”问题有很多线程,但没有人为我工作。还是谢谢你! @miltonb 是的,(我在底部对其进行了编辑)我尝试在 JSLint 中检查“Tolerate For Statement”警告,但它仍然给我警告。 【参考方案1】:

jslint 过于热心(有人会说),它希望所有 var 语句都位于函数的顶部。

您可以通过在上面声明变量的行上添加指令注释来告诉 jslint 您不关心该规则。

// Llenamos el campo de 50 humanos/maquinas/extraterrestres = 150 jugadores
/*jslint for:true */
for (var i=1;i<=50;i+=1)

或者您可以将所有var i; 移动到文件/函数的顶部

【讨论】:

我将该代码放在第一行,但什么也没做。所以我尝试了另一种解决方案,我移动了 for (var=i.... 并在顶部声明了 var=i; 。但现在它说: Unexpected 'for' at top level. for (i=1;i @JoseSerodio 不是在第一行,而是在 for 循环的正上方添加该注释【参考方案2】:

当您选择容忍for 时,它警告您的下一件事是var i 的全局声明。由于您在顶层拥有 for 循环,因此 i 在您的程序中随处可用。

我只能容忍for 并将其包含在 IIFE 中。这样,i 只能在这个函数内部使用,不会泄露到全局范围内。

(function() 
    var i = 0;
    for (i=1;i<=50;i+=1) 
        campo.push(new Human("h"+i));
        campo.push(new Machine("m"+i));
        campo.push(new Alien("e"+i));
    
)();

除非使用现有的实现,否则您还可以创建一个概括“重复 n 次”定义的函数。

function repeat(fn, n) 
  var i = 0;
  for (;i < n; i += 1) 
    fn();
  

在你的情况下使用看起来像:

function initialize()  
    campo.push(new Human("h"+i));
    campo.push(new Machine("m"+i));
    campo.push(new Alien("e"+i));


// then later
repeat(initialize, 50);

【讨论】:

太棒了,成功了。太感谢了。还有其他解决方案吗?它使代码有点混乱 :-) 我知道我可能要求太多了! 好吧,这个函数是专门为你的代码设计的。没有什么能阻止你创建一个函数repeat(),它接受一个函数和次数,并调用给定次数的函数。这实际上是 lodash 所做的:lodash.com/docs#times 此外,还有很多其他人使用 javascript 印章,他们可能有更惯用或更好的东西 - 复选标记通常会阻止更多答案。如果在几天(几天?)之后这仍然是您的最佳解决方案,那么它可能是合适的。 太棒了。我会再次检查这个库,非常感谢你的帮助。 或者,如果需要,您可以将 all 代码推送到闭包中并立即调用该函数。这有点难看,但确实有 jQuery 文档就绪的感觉,而且不完全是反模式。我开始怀疑我是否不应该因为 jdphenix 建议的原因默认这样做——所以你保证你不会污染全局范围。

以上是关于JSLint:意外的“为”。意外的'var'的主要内容,如果未能解决你的问题,请参考以下文章

JSLint 中出现意外的“=”错误

jslint 中出现意外的“++”[重复]

JSLint 的“语句位置出现意外的表达式‘i’”是啥意思?

意外观察:数组的 var_dump() 正在标记引用的元素......从啥时候开始?

无法在 React.js 中读取 json,出现意外的令牌错误

在带有 %var% 的 IF 命令行上出现“(此时意外。”的原因是啥?