Em Javascript, o que significa esse sublinhado?

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

Estou lendo um tutorial sobre backbone.js aqui: http://addyosmani.com/blog/building-spas-jquerys-best-friends/

Quais são os sublinhados? (_index, _photos, _album) Por que usá-los?

TIMEX
fonte
2
os sublinhados não têm significado sintático, provavelmente é uma convenção para esse programador em particular significar o tipo das variáveis
Nate Koppenhaver
possível duplicata do prefixo
BuZZ-dEE

Respostas:

164

Significa campos privados ou métodos privados. Métodos que são apenas para uso interno.

Eles não devem ser invocados fora da classe.

Os campos privados contêm dados para uso interno.

Eles não devem ser lidos ou escritos (diretamente) de fora da classe.

Observação: é muito importante observar que apenas adicionar um sublinhado a uma variável não a torna privada, é apenas uma convenção de nomenclatura.

DrStrangeLove
fonte
4
pelo menos, a ideia de campos privados está lá, mas eles não são realmente privados, você pode acessá-los de qualquer maneira. o autor do código acima apenas significa que eles sejam privados. Isso é tudo.
Sander
Incrível, não sei por que demorei tanto para pesquisar isso! Obrigado.
droid-zilla,
21

Pelo que eu sei, geralmente é usado para indicar uma variável privada (mas não fornece nenhuma privacidade, apenas uma convenção).

Isso é discutido brevemente aqui, embora seja desaconselhado: http://javascript.crockford.com/code.html

oli
fonte
3
Gosto do link: "Evite convenções que demonstrem falta de competência." :-)
Arek
Eu os uso como atalhos ao depurar, especialmente com Promises e outras coisas assíncronas. por exemplo, a maneira "oficial" de acessar algum atributo do meu objeto pode ser, myObj.getSmePromise().then( function(o) { do stuff } );mas é uma dor de digitar no console do Chrome, portanto, parti myObj._someValuedo pressuposto de que o "código adequado" não vai realmente acessá-lo - isto é, no entanto, com o luxo de meus colegas de trabalho também conhecerem essa convenção, se você estiver escrevendo o próximo jQuery / lodash / angular / react ou o que quer que seja, eu não confiaria em todos os seus usuários sabendo ou respeitando isso!
FredL
8

Quando usado como _varnamese fosse apenas parte do nome da variável, não tem significado javascript. Os desenvolvedores usam para significar o significado ou escopo da variável. Nesse caso, parece que está informando ao desenvolvedor que essa variável deve ser local ou privada.

Algumas coisas a serem observadas, neste exemplo específico, usar _.varnamesignificaria uma variável ou função com a biblioteca de sublinhado.js. Também pode-se usar _varnamepara significar uma variável contendo um objeto de sublinhado, da mesma forma que em nosso escritório, usamos $varnamepara significar uma variável contendo um objeto Jquery.

Ryan Gibbons
fonte
4

Provavelmente é usado para marcar propriedades internas / privadas. Assim como em Python, prefixar uma variável com um sublinhado é uma maneira fácil de dizer aos desenvolvedores que uma variável é interna e é melhor eles não mexerem nela (e se o fizerem, mesmo uma pequena atualização da biblioteca envolvida pode quebrar as coisas).

ThiefMaster
fonte
2

Normalmente _é usado para informar ao usuário / programador que se trata de uma variável privada / protegida.

Jan Dragsbaek
fonte
0

Como mencionado, é uma prática entre muitos desenvolvedores, uma prática ruim nisso. Se você tiver que recorrer a convenções como essa em seus métodos de programação, deverá aprender a linguagem, os métodos e os padrões antes de tentar usar a linguagem. Se alguém não consegue distinguir entre métodos públicos / privados em seu código sem o uso do "sublinhado", então sua habilidade de documentação é extremamente deficiente. Muitos dos projetos públicos na web são muito mal documentados, o que provavelmente é o motivo pelo qual as convenções de "sublinhado" foram "aceitas" pela maioria dos desenvolvedores pouco instruídos, enquanto outros decidiram seguir o fluxo em vez de manter os padrões e métodos de design formais. Há uma razão pela qual "sublinhado" não foi escrito nas versões ES6 / 7.

Em um blog, encontrei recentemente um Gerente de Engenharia de Software que declarou: " A convenção de nomenclatura de sublinhado torna realmente fácil saber, à primeira vista, se uma função de variável deve ser pública ou privada. ". Minha resposta é: "Os comentários são como fotos, neste caso valem mil sublinhados.

Existe uma ferramenta de documentação gratuita chamada Doxygen. Embora não suporte especificamente JavaScript, ele pode gerar documentação profissional para seus aplicativos JavaScript quando você usa o prefixo Doxygen em seus comentários. É realmente simples criar aplicativos JavaScript com documentação, tanto para desenvolvedores quanto para usuários, quando você se esforça um pouco nos comentários do código.

Lembre-se de que existem ferramentas que podem remover comentários e declarações de console para "Lançamentos de produção". Dito isso, o uso de mapas de origem é uma perda de tempo e recursos também. Não diminua até que esteja pronto para publicar .. ex. Dev Build (sem minificação, manter comentários e instruções do console), Release Build (remover comentários e instruções do console e minificar o Dev Build. Não há necessidade de recompilar o Dev Build quando for lançado código de qualidade, basta prepará-lo para lançamento e implantá-lo).

BeosFreak
fonte
2
Você não verá um comentário a menos que esteja olhando o código-fonte de uma função. Se você estiver usando a biblioteca / código de outra pessoa, ele adiciona algum valor para poder ver a intenção do método sem ler a fonte ou a documentação. Imo, o prefixo de sublinhado, diz que é uma API não pública na qual não se deve confiar.
Sam P
0

Este é um pequeno adendo. Como já respondido, essas são variáveis ​​pseudo-privadas. Mas então é possível escrever funções pseudo-públicas que acessam essas variáveis ​​privadas.

Fiquei confuso com o código de um colega que efetivamente tem isso (mas enterrado bem fundo em uma biblioteca separada):

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

Agora você tem ambos y.ide y._idesse trabalho e retorna o mesmo valor. Mas se você fizer console.log(y)isso, apenas aparecerá a _idchave.

insira a descrição da imagem aqui

icc97
fonte