web-dev-qa-db-fra.com

En Javascript, que signifie ce trait de soulignement?

var Gallery = Backbone.Controller.extend({
    _index: null,
    _photos: null,
    _album :null,
    _subalbums:null,
    _subphotos:null,
    _data:null,
    _photosview:null,
    _currentsub:null,
    routes: {
        "": "index",
        "subalbum/:id": "subindex",
        "subalbum/:id/" : "directphoto",
        "subalbum/:id/:num" : "hashphoto"
    },
    initialize: function(options) {
        var ws = this;
        if (this._index === null){
            $.ajax({
                url: 'data/album1.json',
                dataType: 'json',
                data: {},
                success: function(data) {
                    ws._data = data;
                    ws._photos =
                    new PhotoCollection(data);
                    ws._index =
                    new IndexView({model: ws._photos});
                    Backbone.history.loadUrl();
                }
            });
            return this;
        }
        return this;
    },
    //Handle rendering the initial view for the
    //application
    index: function() {
        this._index.render();
    },

Je lis un tutoriel sur backbone.js ici: http://addyosmani.com/blog/building-spas-jquerys-best-friends/

Quels sont les underscores? (_index, _photos, _album) Pourquoi les utiliser?

77
TIMEX

Cela signifie des champs privés ou des méthodes privées. Méthodes à usage interne uniquement.

Ils ne doivent pas être invoqués en dehors de la classe.

Les champs privés contiennent des données à usage interne.

Ils ne doivent pas être lus ou écrits (directement) de l'extérieur de la classe.

Il est très important de noter que le simple ajout d'un soulignement à une variable ne la rend pas privée, il s'agit simplement d'une convention de dénomination.

142
DrStrangeLove

Autant que je sache, il est généralement utilisé pour indiquer une variable privée (mais ne fournit en réalité aucune confidentialité, simplement une convention).

On en discute brièvement ici, bien qu'ils soient déconseillés: http://javascript.crockford.com/code.html

21
oli

Lorsqu'il est utilisé comme _varname, il fait simplement partie du nom de la variable et n'a pas de signification javascript. Les développeurs l'utilisent pour indiquer la signification ou la portée de la variable. Dans ce cas, il semble indiquer au développeur que cette variable doit être une variable locale ou privée. 

Quelques points à noter, dans cet exemple particulier, utiliser _.varname signifierait une variable ou une fonction avec la bibliothèque underscore.js. De même, on pourrait utiliser _varname pour désigner une variable contenant un objet de soulignement. De la même manière, dans notre bureau, nous utilisons $varname pour désigner une variable contenant un objet Jquery.

8
Ryan Gibbons

Il est probablement utilisé pour marquer les propriétés internes/privées. Comme en python, préfixer une variable par un trait de soulignement est un moyen simple de dire aux développeurs qu’une variable est interne et qu’il vaut mieux ne pas la manipuler (et même s’ils le font, même une mise à jour mineure de la bibliothèque impliquée peut entraîner des problèmes).

4
ThiefMaster

_ est généralement utilisé pour indiquer à l'utilisateur/au programmeur qu'il s'agit d'une variable privée/protégée en question.

2
Jan Dragsbaek

Ceci est un léger addenda. Comme déjà répondu, ce sont des variables pseudo-privées. Mais il est alors possible d'écrire des pseudo fonctions publiques accédant à ces variables privées.

J'ai été dérouté par un code de collègues qui a effectivement ceci (mais enfoui très profondément dans une bibliothèque séparée):

class x { 
  constructor(id) {this._id = id} 
  get id() {return this._id}
}
let y = new x(3)

Maintenant, vous avez à la fois y.id et y._id qui fonctionnent et qui retournent la même valeur. Mais si vous utilisez console.log(y), il n’affiche que la touche _id.

 enter image description here

0
icc97

Comme mentionné plus haut, c’est une pratique répandue chez beaucoup de développeurs. Si vous devez recourir à de telles conventions dans vos méthodes de programmation, vous devez apprendre le langage, les méthodes et les modèles avant d'essayer de l'utiliser. Si quelqu'un ne peut pas distinguer les méthodes publiques/privées dans votre code sans utiliser le "trait de soulignement", vos compétences en matière de documentation font extrêmement défaut. De nombreux projets publics sur le Web sont très mal documentés, ce qui explique probablement pourquoi les conventions de soulignement ont été «acceptées» par la plupart des développeurs peu instruits, tandis que d'autres ont décidé de suivre le courant plutôt que de conserver les modèles et les méthodes de conception formels. Il y a une raison pour laquelle "underscore" n'a pas été écrit dans les versions ES6/7.

Dans un blog, j’ai récemment rencontré un responsable de l’ingénierie logicielle qui a déclaré: " La convention de dénomination du soulignement facilite la détermination, en un coup d’œil, si une fonction de variable doit être publique ou privée. ". Ma réponse est la suivante: "Les commentaires sont comme des images, dans ce cas, ils valent mille soulignements.

Il existe un outil de documentation gratuit appelé Doxygen. Bien qu'il ne prenne pas spécifiquement en charge JavaScript, il peut générer une documentation professionnelle pour vos applications JavaScript lorsque vous utilisez le préfixe Doxygen dans vos commentaires. Il est très simple de créer des applications JavaScript avec documentation, à la fois pour les développeurs et les utilisateurs, lorsque vous mettez un peu d'effort dans les commentaires de votre code. 

N'oubliez pas qu'il existe des outils permettant de supprimer des commentaires et des instructions de console pour les "versions de production". Cela dit, l’utilisation des cartes sources est une perte de temps et de ressources. Par exemple, Dev Build (pas de minification, conservez les commentaires et les instructions de la console), Release Build (supprimez les commentaires et les instructions de la console et réduisez la construction du développeur. Il n'est donc pas nécessaire de recompiler la construction du développeur dès sa sortie. code de qualité, préparez-le pour la sortie et déployez-le).

0
BeosFreak