En Javascript, que signifie ce trait de soulignement?

85
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 traits de soulignement? (_index, _photos, _album) Pourquoi les utiliser?

TIMEX
la source
2
les traits de soulignement n'ont pas de signification syntaxique, c'est probablement une convention pour ce programmeur particulier de signifier le type des variables
Nate Koppenhaver
duplication possible du préfixe
BuZZ-dEE

Réponses:

164

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

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.

Remarque: Il est très important de noter que le simple fait d'ajouter un trait de soulignement à une variable ne la rend pas privée, il s'agit uniquement d'une convention de dénomination.

DrStrangeLove
la source
4
au moins, l'idée de champs privés est là, mais ils ne sont pas vraiment privés, vous pouvez y accéder quand même. l'auteur du code ci-dessus voulait juste qu'ils soient privés. c'est tout.
Sander
Génial, je ne sais pas pourquoi il m'a fallu si longtemps pour chercher ça! Merci.
droid-zilla
21

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

Il est brièvement discuté ici, bien qu'ils soient déconseillés: http://javascript.crockford.com/code.html

Oli
la source
3
J'aime le lien: «Évitez les conventions qui démontrent un manque de compétence». :-)
Arek
Je les utilise comme raccourcis lors du débogage, en particulier avec Promises et autres trucs asynchrones. par exemple, le moyen "officiel" d'accéder à un attribut de mon objet pourrait être, myObj.getSmePromise().then( function(o) { do stuff } );mais c'est difficile à taper sur la console Chrome, donc je suis parti myObj._someValuedu principe que le "code approprié" n'y accédera pas réellement - c'est cependant avec le luxe de mes collègues connaissant également cette convention, si vous écrivez le prochain jQuery / lodash / angular / react ou quoi que ce soit, je ne compterais pas sur tous vos utilisateurs le sachant ou le respectant!
FredL
8

Lorsqu'il est utilisé comme _varnames'il s'agissait simplement d'une partie du nom de la variable, et qu'il n'a pas de signification JavaScript. Les développeurs l'utilisent pour signifier la signification ou la portée de la variable. Dans ce cas, il semble que cela indique au développeur que cette variable doit être une variable locale ou privée.

Quelques points à noter, dans cet exemple particulier, utiliser _.varnamesignifierait une variable ou une fonction avec la bibliothèque underscore.js. On pourrait également utiliser _varnamepour signifier une variable contenant un objet de soulignement, de la même manière à notre bureau, nous utilisons $varnamepour signifier une variable contenant un objet Jquery.

Ryan Gibbons
la source
4

Il est probablement utilisé pour marquer les propriétés internes / privées. Tout comme en python, préfixer une variable avec un trait de soulignement est un moyen facile de dire aux développeurs qu'une variable est interne et qu'ils feraient mieux de ne pas la falsifier (et s'ils le font, même une mise à jour mineure de la bibliothèque impliquée peut casser les choses).

ThiefMaster
la source
2

Habituellement, il _est utilisé pour indiquer à l'utilisateur / programmeur qu'il s'agit d'une variable privée / protégée en question.

Jan Dragsbaek
la source
0

Comme mentionné, c'est une pratique parmi de nombreux développeurs, une mauvaise à cela. 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 d'utiliser le langage. Si quelqu'un ne peut pas faire la distinction entre les méthodes publiques / privées dans votre code sans utiliser le "trait de soulignement", alors vos compétences en documentation font cruellement défaut. Beaucoup de 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 méthodes de conception formels. Il y a une raison pour laquelle "souligné" n'a pas été écrit dans les versions ES6 / 7.

Dans un blog, je suis récemment tombé sur un Software Engineer Manager qui déclarait: " La convention de dénomination des traits de soulignement permet de dire très facilement, en un coup d'œil, si une fonction variable est destinée à être publique ou privée. ". Ma réponse est: "Les commentaires sont comme des images, dans ce cas, ils valent mille traits de soulignement.

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. C'est vraiment simple de créer des applications JavaScript avec de la documentation, pour les développeurs et les utilisateurs lorsque vous mettez un peu d'effort dans vos commentaires de code.

N'oubliez pas qu'il existe des outils qui peuvent supprimer des commentaires et des instructions de console pour les «versions de production». Cela étant dit, l'utilisation de cartes sources est également une perte de temps et de ressources. Ne réduisez pas la taille jusqu'à ce que vous soyez prêt à publier. Par exemple, Dev Build (pas de minification, conserver les commentaires et les instructions de la console), Release Build (supprimer les commentaires et les instructions de la console et réduire la version de Dev. Pas besoin de recompiler la Dev Build lors de sa sortie code qualité, il suffit de le préparer pour la publication et de le déployer).

BeosFreak
la source
2
Vous ne verrez pas de commentaire sauf si vous regardez le code source d'une fonction. Si vous utilisez la bibliothèque / le code de quelqu'un d'autre, cela ajoute de la valeur pour pouvoir voir l'intention de la méthode sans lire la source ou la documentation. Imo, le préfixe de soulignement indique qu'il s'agit d'une API non publique sur laquelle il ne faut pas se fier.
Sam P
0

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

J'ai été confus par un code de collègues qui a effectivement ceci (mais enterré 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 les deux y.idet y._idcela fonctionne et retournez la même valeur. Mais si vous le faites, console.log(y)cela ne montre que la _idclé.

entrez la description de l'image ici

icc97
la source