Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JSLint: Unexpected 'for'. Unexpected 'var'

I've searching and trying other suggestions in StackOverflow. Unfortunately the answers are not working for me. They are suggesting to use 'foreach' instead of 'for', but how could I... if I want to iterate just 50 times? :<

Well, I'll just paste the code and let's see if some good folk can help me.

JSLint was unable to finish.

Unexpected 'for'. for (var i=1;i<=50;i+=1){
line 6 column 8

Unexpected 'var'. for (var i=1;i<=50;i+=1){
line 6 column 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!!");
    }

There are some other for in the code, but It seems to stop at the first one. Thank you in advance! Forgot to say, the code works PERFECT. But I was just validating it with JSLint, also 'tolerating' for warnings in JSLint doesn't work.

like image 647
Jose Serodio Avatar asked Feb 10 '16 22:02

Jose Serodio


2 Answers

When you choose to tolerate for, the next thing it's warning you about is the global declaration of the var i. Since you've got the for-loop at the top-level, i becomes available everywhere in your program.

I'd just tolerate for and wrap it up an in IIFE. That way, i is only available inside this function, and doesn't leak out to the global scope.

(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));
    }
})();

You could also, barring using an existing implementation out there, create a function that generalizes the "repeat n times" definition.

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

Use in your case would look like:

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);
like image 52
jdphenix Avatar answered Nov 16 '22 18:11

jdphenix


jslint is being overzealous (some would say), it expects all var statements to be at the top of a function.

You can tell jslint that you don't care about that rule by adding an instruction comment on the line above where you are declaring the variable.

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

Or you can move all your var i; to the top of the file/function

like image 24
Juan Mendes Avatar answered Nov 16 '22 16:11

Juan Mendes