73 votes

JSLint : Erreur d'utilisation d'une fonction avant qu'elle ne soit définie

J'utilise JSLint pour vérifier la plupart de mes fichiers Javascript externes, mais le plus grand nombre d'erreurs que je reçois provient de fonctions utilisées avant d'être définies.

Est-ce que c'est vraiment un problème dont je devrais m'inquiéter ?

Il semble que FF, IE7 et Chrome s'en moquent. Des fonctions comme la populaire init() que j'utilise souvent, normalement placée en haut car cela me semble logique (j'aime prétendre qu'elle est analogue à main()) devront, selon JSLint, être poussées vers le bas du fichier.

84voto

kontur Points 1792

Comme il s'agit de la réponse la plus fréquente de Google et que d'autres personnes ne la verront peut-être pas tout de suite dans l'outil jslint, il existe une option appelée "Tolerate misordered definitions" qui vous permet de masquer ce type d'erreur.

/*jslint latedef:false*/

69voto

Steve Harrison Points 31062

Si vous déclarez des fonctions en utilisant l'option function vous pouvez les utiliser avant qu'ils ne soient déclarés. Toutefois, si vous déclarez une fonction par une autre méthode (par exemple, en utilisant une expression de fonction ou la fonction Function constructeur), vous devez déclarer la fonction avant de l'utiliser. Voir cette page sur le Centre des développeurs Mozilla pour plus d'informations.

En supposant que vous déclarez toutes vos fonctions avec la balise function mot-clé, je pense que cela devient une question de style de programmation. Personnellement, je préfère structurer mes fonctions d'une manière qui semble logique et qui rend le code aussi lisible que possible. Par exemple, comme vous, je mettrais une fonction init au sommet, car c'est de là que tout part.

33voto

Jan Molak Points 606

Si vous utilisez jshint, vous pouvez configurer latedef a nofunc qui ignorera uniquement les définitions de fonctions tardives.

Documentation - http://www.jshint.com/docs/options/#latedef

Exemple d'utilisation :

/* jshint latedef:nofunc */

noop();

function noop() {}

J'espère que cela vous aidera.

11voto

stanton Points 269

Extrait du site web de jslint ( http://www.jslint.com/lint.html ), vous pouvez lire sur la directive /*global*/ qui vous permet de définir des variables qui sont supposées être déclarées ailleurs.

Voici un exemple (mettez-le en haut du fichier) :

/*global var1,var2,var3,var4,var5*/

L'option :true :false n'est pas vraiment nécessaire d'après mon expérience, mais il semble qu'elle soit recommandée d'après ce que j'ai lu sur le site.

Assurez-vous que l'instruction globale initiale est sur la même ligne que /* ou bien il se casse.

2voto

SeanK Points 11

J'avais le nœud suivant script qui générait l'avertissement dans cette question. J'ai essayé d'utiliser latedef pour apprendre qu'il avait été supprimé. J'ai essayé d'ajouter un commentaire à la réponse ci-dessus mais je n'ai pas la réputation pour le faire. Comme vous pouvez le constater, la déclaration de la fonction dans le commentaire global suivie d'un true pour indiquer qu'elle est inscriptible corrige l'avertissement.

/*jslint indent: 4, node: true, stupid: true*/
/*global require: false, process: false, readFileSync: false, touchPath: true */
var path = require('path'),
    fs = require('fs'),
    argv = process.argv,
    argc = argv.length;

function enumPaths(pathname, num) {
    "use strict";

    var files = fs.readdirSync(pathname).sort(),
        count  = files.length,
        i = 0,
        file = '';

    for (i = 0; i < count; i += 1) {
        file = path.resolve(pathname, files[i]);

        touchPath(file, num);
    }
}

function touchPath(pathname, num) {
    "use strict";

    var sec = num * 24 * 60 * 60,
        stat = {};

    try {
        stat = fs.statSync(pathname);
        fs.utimesSync(pathname, (stat.atime / 1000) - sec, (stat.mtime / 1000) - sec);

        if (stat.isDirectory()) {
            enumPaths(pathname, num);
        }
    } catch (err) {
        console.log(err);
    }
}

function main(argc, argv) {
    "use strict";

    if (argc !== 4) {
        console.log('usage: %s %s dir num', argv[0], argv[1]);
    } else {
        touchPath(argv[2], argv[3]);
    }
}

if (!String.prototype.format) {
    String.prototype.format = function () {
        "use strict";

        var args = arguments;
        return this.replace(/\{(\d+)\}/g, function (match, number) {
            var result = args[number] || match;
            return result;
        });
    };
}

main(argc, argv);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X