In Javascript, cosa significa questo trattino basso?


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

Sto leggendo un tutorial su backbone.js qui: http://addyosmani.com/blog/building-spas-jquerys-best-friends/

Quali sono le sottolineature? (_index, _photos, _album) Perché usarli?


2
i trattini bassi non hanno alcun significato sintattico, probabilmente è una convenzione per quel particolare programmatore indicare il tipo delle variabili
Nate Koppenhaver

possibile duplicato del prefisso
trattino basso

Risposte:


164

Significa campi privati ​​o metodi privati. Metodi che sono solo per uso interno.

Non dovrebbero essere invocati al di fuori della classe.

I campi privati ​​contengono dati per uso interno.

Non dovrebbero essere letti o scritti (direttamente) dall'esterno della classe.

Nota: è molto importante notare che la semplice aggiunta di un carattere di sottolineatura a una variabile non la rende privata, è solo una convenzione di denominazione.


4
almeno, l'idea dei campi privati ​​c'è, ma non sono realmente privati, puoi accedervi comunque. l'autore del codice sopra voleva solo che fossero privati. È tutto.
Sander

Fantastico, non so perché mi ci sia voluto così tanto tempo per cercarlo! Grazie.
droid-zilla

21

Per quanto ne so, è generalmente utilizzato per indicare una variabile privata (ma in realtà non fornisce alcuna privacy, solo una convenzione).

È discusso brevemente qui, anche se è sconsigliato: http://javascript.crockford.com/code.html


3
Mi piace il collegamento: "Evita le convenzioni che dimostrano una mancanza di competenza". :-)
Arek

Li uso come scorciatoie durante il debug, in particolare con Promises e altre cose asincrone. ad esempio, il modo "ufficiale" per accedere ad alcuni attributi del mio oggetto potrebbe essere, myObj.getSmePromise().then( function(o) { do stuff } );ma è un problema da digitare sulla console di Chrome, quindi ho deciso myObj._someValueche il "codice corretto" non vi accederà effettivamente - questo è, tuttavia, con il lusso che i miei colleghi conoscano anche questa convenzione, se stai scrivendo il prossimo jQuery / lodash / angular / react o qualsiasi altra cosa non farei affidamento sul fatto che tutti i tuoi utenti lo sappiano o rispettino!
FredL

8

Quando viene utilizzato come _varnamese fosse solo una parte del nome delle variabili e non ha alcun significato javascript. Gli sviluppatori lo usano per indicare il significato o l'ambito della variabile. In questo caso sembra che stia dicendo allo sviluppatore che questa variabile dovrebbe essere una variabile locale o privata.

Alcune cose da notare, in questo particolare esempio l'utilizzo _.varnamesignificherebbe una variabile o una funzione con la libreria underscore.js. Inoltre si potrebbe usare _varnameper indicare una variabile che $varnamecontiene un oggetto di sottolineatura, allo stesso modo nel nostro ufficio, usiamo per indicare una variabile contenente un oggetto Jquery.


4

Probabilmente è usato per contrassegnare proprietà interne / private. Proprio come in Python anteporre una variabile con un trattino basso è un modo semplice per dire agli sviluppatori che una variabile è interna ed è meglio che non la manomettano (e se lo fanno, anche un aggiornamento minore della libreria coinvolta potrebbe rompere le cose).


2

Di solito _viene utilizzato per indicare all'utente / programmatore che si tratta di una variabile privata / protetta in questione.


0

Come accennato, è una pratica tra molti sviluppatori, una cattiva per questo. Se devi ricorrere a convenzioni come questa nei tuoi metodi di programmazione, dovresti imparare il linguaggio, i metodi e gli schemi prima di tentare di usare il linguaggio. Se qualcuno non riesce a distinguere tra metodi pubblici / privati ​​nel codice senza l'uso del "trattino basso", allora le tue capacità di documentazione sono estremamente carenti. Molti dei progetti pubblici sul web sono molto scarsamente documentati, motivo per cui le convenzioni di "sottolineatura" sono state "accettate" dalla maggior parte degli sviluppatori meno istruiti, mentre altri hanno deciso di seguire il flusso piuttosto che mantenere i modelli e metodi di progettazione formale. C'è un motivo per cui "underscore" non è stato scritto nelle versioni ES6 / 7.

In un blog mi sono imbattuto di recente in un Software Engineer Manager che ha affermato: " La convenzione di denominazione con caratteri di sottolineatura rende davvero facile dire, a colpo d'occhio, se una funzione variabile è intesa come pubblica o privata ". La mia risposta è: "I commenti sono come le immagini, in questo caso valgono mille sottolineature.

C'è uno strumento di documentazione gratuito chiamato Doxygen. Sebbene non supporti in modo specifico JavaScript, può generare documentazione professionale per le tue applicazioni JavaScript quando usi il prefisso Doxygen nei tuoi commenti. È davvero semplice creare applicazioni JavaScript con documentazione, sia per gli sviluppatori che per gli utenti quando ci si impegna leggermente nei commenti sul codice.

Ricorda, esistono strumenti che possono rimuovere i commenti e le istruzioni della console per le "versioni di produzione". Detto questo, l'uso delle mappe di origine è anche una perdita di tempo e risorse. Non ridurre a icona fino a quando non sei pronto per la pubblicazione .. ovvero Dev Build (nessuna minimizzazione, conserva commenti e istruzioni della console), Release Build (rimuovi commenti e istruzioni della console e minimizza la Dev build. Non c'è bisogno di ricompilare la Dev Build al suo rilascio codice di qualità, preparalo per il rilascio e distribuiscilo).


2
Non vedrai un commento a meno che tu non stia guardando il codice sorgente di una funzione. Se stai usando la libreria / codice di qualcun altro, aggiunge un certo valore per essere in grado di vedere l'intento del metodo senza leggere la fonte o la documentazione. Imo il prefisso di sottolineatura dice che si tratta di un'API non pubblica su cui non si dovrebbe fare affidamento.
Sam P

0

Questa è una leggera aggiunta. Come già risposto, queste sono variabili pseudo private. Ma è quindi possibile scrivere funzioni pseudo pubbliche che accedono a queste variabili private.

Sono stato confuso da un codice di colleghi che ha effettivamente questo (ma sepolto molto in profondità in una libreria separata):

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

Ora hai entrambi y.ide y._idquel lavoro e restituisci lo stesso valore. Ma se lo fai console.log(y)mostra solo la _idchiave.

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.