Was bedeutet dieser Unterstrich in Javascript?

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

Ich lese hier ein Tutorial auf backbone.js: http://addyosmani.com/blog/building-spas-jquerys-best-friends/

Was sind die Unterstriche? (_index, _photos, _album) Warum sie verwenden?

TIMEX
quelle
2
Die Unterstriche haben keine syntaktische Bedeutung. Es ist wahrscheinlich eine Konvention für diesen bestimmten Programmierer, den Typ der Variablen zu kennzeichnen
Nate Koppenhaver

Antworten:

162

Es bedeutet private Felder oder private Methoden. Methoden, die nur für den internen Gebrauch bestimmt sind.

Sie sollten nicht außerhalb der Klasse aufgerufen werden.

Private Felder enthalten Daten für den internen Gebrauch.

Sie sollten nicht (direkt) von außerhalb der Klasse gelesen oder geschrieben werden.

Hinweis: Es ist sehr wichtig zu beachten, dass das Hinzufügen eines Unterstrichs zu einer Variablen diese nicht privat macht, sondern nur eine Namenskonvention ist.

DrStrangeLove
quelle
4
Zumindest ist die Idee von privaten Feldern da, aber sie sind nicht wirklich privat, Sie können trotzdem darauf zugreifen. Der Autor des obigen Codes wollte nur, dass sie privat sind. das ist alles.
Sander
Genial, ich weiß nicht, warum ich so lange gebraucht habe, um das nachzuschlagen! Vielen Dank.
Droiden-Zilla
21

Soweit mir bekannt ist, wird es im Allgemeinen verwendet, um eine private Variable anzugeben (bietet jedoch keine Privatsphäre, sondern nur eine Konvention).

Es wird hier kurz besprochen, obwohl davon abgeraten wird: http://javascript.crockford.com/code.html

oli
quelle
3
Ich mag den Link: "Vermeiden Sie Konventionen, die einen Mangel an Kompetenz zeigen." :-)
Arek
Ich benutze sie als Verknüpfungen beim Debuggen, insbesondere bei Promises und anderen asynchronen Dingen. Beispiel: Die "offizielle" Möglichkeit, auf ein Attribut meines Objekts zuzugreifen, könnte sein, myObj.getSmePromise().then( function(o) { do stuff } );aber das ist ein Problem, das an der Chrome-Konsole eingegeben werden muss. Daher habe ich mir vorgenommen myObj._someValue, dass "richtiger Code" nicht wirklich darauf zugreift - dies ist jedoch bei Der Luxus meiner Mitarbeiter, diese Konvention auch zu kennen, wenn Sie die nächste jQuery / lodash / angle / react schreiben oder was auch immer, ich würde mich nicht darauf verlassen, dass alle Ihre Benutzer dies wissen oder respektieren!
FredL
8

Bei Verwendung wird _varnamees nur als Teil des Variablennamens verwendet und hat keine Javascript-Bedeutung. Entwickler verwenden es, um die Bedeutung oder den Umfang der Variablen zu kennzeichnen. In diesem Fall sieht es so aus, als würde der Entwickler erfahren, dass diese Variable eine lokale oder private Variable sein soll.

Ein paar Dinge zu beachten, in diesem speziellen Beispiel _.varnamewürde die Verwendung einer Variablen oder Funktion mit der Bibliothek underscore.js bedeuten. Man könnte auch _varnameeine Variable kennzeichnen, die ein Unterstrichobjekt enthält, ähnlich wie in unserem Büro $varnameeine Variable, die ein Jquery-Objekt enthält.

Ryan Gibbons
quelle
4

Es wird wahrscheinlich verwendet, um interne / private Eigenschaften zu markieren. Genau wie in Python ist das Präfixieren einer Variablen mit einem Unterstrich eine einfache Möglichkeit, Entwicklern mitzuteilen, dass eine Variable intern ist, und sie sollten sie besser nicht manipulieren (und wenn sie dies tun, kann sogar ein geringfügiges Update der beteiligten Bibliothek zu Problemen führen).

DiebMaster
quelle
2

Wird normalerweise _verwendet, um dem Benutzer / Programmierer mitzuteilen, dass es sich um eine private / geschützte Variable handelt.

Jan Dragsbaek
quelle
0

Wie bereits erwähnt, ist dies bei vielen Entwicklern eine schlechte Praxis. Wenn Sie bei Ihren Programmiermethoden auf solche Konventionen zurückgreifen müssen, sollten Sie die Sprache, Methoden und Muster lernen, bevor Sie versuchen, die Sprache zu verwenden. Wenn jemand in Ihrem Code nicht zwischen öffentlichen und privaten Methoden unterscheiden kann, ohne den "Unterstrich" zu verwenden, fehlt es Ihnen an Dokumentationsfähigkeiten. Viele der öffentlichen Projekte im Internet sind sehr schlecht dokumentiert, weshalb die "Unterstrich" -Konventionen wahrscheinlich von den meisten untergebildeten Entwicklern "akzeptiert" wurden, während andere beschlossen, mit dem Fluss zu gehen, anstatt die formalen Entwurfsmuster und -methoden beizubehalten. Es gibt einen Grund, warum "Unterstrich" nicht in ES6 / 7-Versionen geschrieben wurde.

In einem Blog bin ich kürzlich auf einen Software Engineer Manager gestoßen, der erklärte: " Die Unterstrich-Namenskonvention macht es wirklich einfach, auf einen Blick zu erkennen, ob eine variable Funktion öffentlich oder privat sein soll. " Meine Antwort lautet: "Kommentare sind wie Bilder, in diesem Fall sind sie tausend Unterstriche wert.

Es gibt ein kostenloses Dokumentationswerkzeug namens Doxygen. JavaScript wird zwar nicht speziell unterstützt, es kann jedoch eine professionelle Dokumentation für Ihre JavaScript-Anwendungen erstellen, wenn Sie in Ihren Kommentaren Doxygen-Präfixe verwenden. Es ist wirklich einfach, JavaScript-Anwendungen mit Dokumentation zu erstellen, sowohl für Entwickler als auch für Benutzer, wenn Sie ein wenig Aufwand in Ihre Codekommentare investieren.

Denken Sie daran, dass es Tools gibt, mit denen Kommentare und Konsolenanweisungen für "Produktionsversionen" entfernt werden können. Allerdings ist die Verwendung von Quellkarten auch eine Verschwendung von Zeit und Ressourcen. Minimieren Sie nicht, bis Sie zur Veröffentlichung bereit sind. Dh Dev Build (keine Minimierung, behalten Sie Kommentare und Konsolenanweisungen bei), Release Build (entfernen Sie Kommentare und Konsolenanweisungen und minimieren Sie den Dev Build. Sie müssen den Dev Build bei seiner Veröffentlichung nicht neu kompilieren Qualitätscode, bereiten Sie ihn einfach für die Veröffentlichung vor und stellen Sie ihn bereit).

BeosFreak
quelle
2
Sie sehen keinen Kommentar, es sei denn, Sie sehen sich den Quellcode einer Funktion an. Wenn Sie die Bibliothek / den Code einer anderen Person verwenden, bietet dies einen Mehrwert, um die Absicht der Methode erkennen zu können, ohne die Quelle oder Dokumentation zu lesen. Im Unterstrich steht, dass es sich um eine nicht öffentliche API handelt, auf die man sich nicht verlassen sollte.
Sam P
0

Dies ist ein kleiner Nachtrag. Wie bereits beantwortet, handelt es sich um pseudo-private Variablen. Es ist dann aber möglich, pseudo-öffentliche Funktionen zu schreiben, die auf diese privaten Variablen zugreifen.

Ich wurde durch einen Kollegencode verwirrt, der dies effektiv hat (aber sehr tief in einer separaten Bibliothek vergraben ist):

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

Jetzt haben Sie beide y.idund y._iddiese Arbeit und geben den gleichen Wert zurück. Wenn Sie dies tun console.log(y), wird nur der _idSchlüssel angezeigt.

Geben Sie hier die Bildbeschreibung ein

icc97
quelle