Perché è raro (o?) usare _ (underscore) in JS private vars?

0

Venendo in JavaScript dal mondo C # e C / C ++, sono abituato a decorare i miei membri privati con caratteri di sottolineatura.

Ma un paio di sviluppatori JS che conosco mi hanno detto che non è comune nel mondo JS, e il mio codice sembra "strano" per loro. Mi sono intrigato e intervistato circa 4-5 sviluppatori di JS e tutti hanno confermato.

Per essere chiari, lei è il mio codice:

var myObject = new myClass("some value");

function myClass(param) {
    var _privateVar = param;

    this.publicMethod = function() {
        alert(_privateVar);
    }
}

Ora le mie domande sono :

  1. È vero? Dovrei smettere di scrivere codice come questo - nota, chiedo solo nell'ambito delle assunzioni, voglio solo essere sicuro che i nuovi arrivati non troveranno il nostro codice "strano"

  2. Se è vero, c'è qualche spiegazione? O è sorta "storicamente"? Non sto cercando di iniziare una guerra di fuoco o qualcosa del genere, solo curioso, sto bene con il dumping delle mie vecchie abitudini.

UPDATE

OK, forse non dovrei chiamarla variabile "privata" b / c in realtà è una variabile "locale" ... Ma sai cosa intendo. Devo essere in grado di distinguere rapidamente l'ambito della variabile, semplicemente guardandolo. Quanto "locali" sono i vars? Sono locali a publicMethod o all'intero myClass ? Questo è il motivo dell'uso del carattere di sottolineatura, non della "privacy" attuale

    
posta jitbit 25.10.2017 - 00:54
fonte

2 risposte

5

Forse non è così comune come ci si potrebbe aspettare perché javascript non ha esaclty variabili private ...

L'uso del prefisso _ è qualcosa che gli sviluppatori non javascript portano da altre lingue, ma non è convenzionale e potrebbe causare confusione.

Non è del tutto inusuale usare il prefisso _, tuttavia, come puoi vedere in altre domande SO come:

link

link

o documentazione come

link

Ci sono anche degli sviluppatori molto ben rispettati che sostengono l'uso del _, un esempio di questo è questo commento di Ward Bell :

TypeScript/JavaScript doesn't have true private variables and the use of classes means that we have even less of an ability to hide variables than in pre-class JavaScript. We have only the '_' convention to save us.

The primary value of the '_' convention is that it shouts "Do not touch!". When debugging the JavaScript it's all we have to go on.

When people see something.foo in the debugger, they can't know for certain if that foo is (a) public and undocumented or (b) private. Without adequate notice, they feel free to reference it in their own code. In that moment, the developer incurs a support obligation.

When readers see _foo, they should know it is off limits. If they reference _foo they do so at their own risk. There must be no tears when the developer removes it or changes its behavior.

In our docs and samples private members should begin with ''. Where we have neglected to prefix a private with '', we correct that quickly.

    
risposta data 25.10.2017 - 01:12
fonte
3

Nel tuo esempio, _privateVar non è una variabile privata. È una variabile locale. Dopo che myClass è terminato, è disponibile per nessuno (a meno che non sia in chiusura). Non esiste una variabile privata in Javascript.

Le variabili locali sono le più comuni * e sembra un po 'folle per contrassegnarle tutte con caratteri di sottolineatura. Inoltre, tutti gli argomenti delle funzioni hanno anche un ambito locale; hai intenzione di contrassegnare tutti i tuoi parametri con caratteri di sottolineatura? Sarebbe orribile.

Se desideri chiarire la differenza tra le variabili locali e globali, ti suggerisco di utilizzare window per contrassegnare le variabili globali (poiché è qui che vivono realmente ).

Quindi

var myVariable = "Local value";
window.myVariable = "Global value";

* Se trovi che nel tuo codice le variabili globali sono più comuni delle variabili locali, sono abbastanza sicuro che tu stia sbagliando.

    
risposta data 25.10.2017 - 02:18
fonte

Leggi altre domande sui tag