JSLint:意想不到的“为”.意想不到的“var”

JSLint: Unexpected 'for'. Unexpected 'var'

本文关键字:意想不到 var JSLint      更新时间:2023-09-26

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

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

JSLint 无法完成。

出乎意料的"为"。 for (var i=1;i<=50;i+=1){
第 6 行第 8 列

意想不到的"var"。 for (var i=1;i<=50;i+=1){
第 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 中的警告不起作用。

当你选择容忍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);

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;移动到文件/函数的顶部