En Javascript, ¿qué significa este guión bajo?

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

Estoy leyendo un tutorial sobre backbone.js aquí: http://addyosmani.com/blog/building-spas-jquerys-best-friends/

¿Qué son los guiones bajos? (_index, _photos, _album) ¿Por qué utilizarlos?

TIMEX
fuente
2
los guiones bajos no tienen significado sintáctico, probablemente sea una convención para ese programador en particular indicar el tipo de las variables
Nate Koppenhaver
posible duplicado del prefijo de
subrayado

Respuestas:

164

Significa campos privados o métodos privados. Métodos que son solo para uso interno.

No deben invocarse fuera de la clase.

Los campos privados contienen datos para uso interno.

No deben leerse ni escribirse (directamente) desde fuera de la clase.

Nota: Es muy importante tener en cuenta que el simple hecho de agregar un guión bajo a una variable no la convierte en privada, es solo una convención de nomenclatura.

DrStrangeLove
fuente
4
al menos, la idea de los campos privados está ahí, pero no son realmente privados, puedes acceder a ellos de todos modos. el autor del código anterior solo quería que fueran privados. eso es todo.
Sander
¡Impresionante, no sé por qué me tomó tanto tiempo buscar esto! Gracias.
droid-zilla
21

Hasta donde yo sé, generalmente se usa para indicar una variable privada (pero en realidad no proporciona ninguna privacidad, solo una convención).

Se trata brevemente aquí, aunque se desaconseja: http://javascript.crockford.com/code.html

oli
fuente
3
Me gusta el enlace: "Evite las convenciones que demuestren una falta de competencia". :-)
Arek
Los uso como atajos al depurar, particularmente con Promises y otras cosas asincrónicas. p. ej., la forma "oficial" de acceder a algún atributo de mi objeto podría ser, myObj.getSmePromise().then( function(o) { do stuff } );pero es difícil escribir en la consola de Chrome, por lo myObj._someValueque asumí que el "código adecuado" en realidad no accederá a él; sin embargo, esto es con el lujo de que mis compañeros de trabajo también conozcan esta convención, si está escribiendo el próximo jQuery / lodash / angular / react o lo que sea, ¡no confiaría en que todos sus usuarios sepan o respeten esto!
FredL
8

Cuando se usa como _varname fuera solo parte del nombre de las variables y no tiene ningún significado javascript. Los desarrolladores lo usan para indicar el significado o alcance de la variable. En este caso, parece que le está diciendo al desarrollador que esta variable debe ser una variable local o privada.

Algunas cosas a tener en cuenta, en este ejemplo particular, el uso _.varnamesignificaría una variable o función con la biblioteca underscore.js. También se podría usar _varnamepara significar una variable que contiene un objeto de subrayado, de manera similar en nuestra oficina, usamos $varnamepara significar una variable que contiene un objeto Jquery.

Ryan Gibbons
fuente
4

Probablemente se use para marcar propiedades internas / privadas. Al igual que en Python, el prefijo de una variable con un guión bajo es una manera fácil de decirle a los desarrolladores que una variable es interna y que es mejor que no la manipulen (y si lo hacen, incluso una actualización menor de la biblioteca involucrada puede romper cosas).

ThiefMaster
fuente
2

Generalmente _se usa para decirle al usuario / programador que se trata de una variable privada / protegida en cuestión.

Jan Dragsbaek
fuente
0

Como se mencionó, es una práctica entre muchos desarrolladores, y una mala en eso. Si tiene que recurrir a convenciones como esta en sus métodos de programación, debe aprender el lenguaje, los métodos y los patrones antes de intentar usar el lenguaje. Si alguien no puede distinguir entre métodos públicos / privados en su código sin el uso del "guión bajo", entonces su habilidad de documentación es extremadamente deficiente. Muchos de los proyectos públicos en la web están muy mal documentados, por lo que probablemente la mayoría de los desarrolladores con poca formación "aceptaron" las convenciones de "subrayado", mientras que otros decidieron seguir la corriente en lugar de mantener los patrones y métodos de diseño formales. Hay una razón por la que no se escribió "subrayado" en las versiones ES6 / 7.

En un blog, me encontré recientemente con un gerente de ingeniería de software que dijo: " La convención de nomenclatura de subrayado hace que sea realmente fácil saber, de un vistazo, si una función variable está destinada a ser pública o privada ". Mi respuesta es: "Los comentarios son como imágenes, en este caso valen mil guiones bajos.

Existe una herramienta de documentación gratuita llamada Doxygen. Si bien no es compatible específicamente con JavaScript, puede generar documentación profesional para sus aplicaciones JavaScript cuando usa los prefijos de Doxygen en sus comentarios. Es realmente sencillo crear aplicaciones JavaScript con documentación, tanto para desarrolladores como para usuarios, cuando pones un poco de esfuerzo en los comentarios de tu código.

Recuerde, existen herramientas que pueden eliminar comentarios y declaraciones de consola para "Versiones de producción". Dicho esto, el uso de mapas de origen también es una pérdida de tiempo y de recursos. No minimice hasta que esté listo para publicar ... es decir, Dev Build (sin minificación, mantenga los comentarios y las declaraciones de la consola), Release Build (elimine los comentarios y las declaraciones de la consola y minimice la compilación del desarrollador. No es necesario volver a compilar la Dev Build cuando se publique código de calidad, solo prepárelo para su lanzamiento e impleméntelo).

BeosFreak
fuente
2
No verá un comentario a menos que esté mirando el código fuente de una función. Si está utilizando la biblioteca / código de otra persona, agrega algún valor para poder ver la intención del método sin leer la fuente o la documentación. Imo, el prefijo de subrayado dice que es una API no pública en la que no se debe confiar.
Sam P
0

Este es un pequeño apéndice. Como ya se respondió, estas son variables pseudoprivadas. Pero luego es posible escribir funciones pseudo públicas que accedan a estas variables privadas.

Me confundió el código de un colega que efectivamente tiene esto (pero enterrado muy profundamente en una biblioteca separada):

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

Ahora tienes ambos y.idy y._ideso funciona y devuelve el mismo valor. Pero si lo haces console.log(y), solo aparece la _idclave.

ingrese la descripción de la imagen aquí

icc97
fuente