Co oznacza to podkreślenie w JavaScript?


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

Czytam tutorial na temat backbone.js tutaj: http://addyosmani.com/blog/building-spas-jquerys-best-friends/

Jakie są podkreślenia? (_index, _photos, _album) Po co ich używać?


2
podkreślenia nie mają znaczenia składniowego, prawdopodobnie jest to konwencja dla tego konkretnego programisty oznaczająca typ zmiennych
Nate Koppenhaver,

Odpowiedzi:


164

Oznacza to prywatne pola lub prywatne metody. Metody przeznaczone wyłącznie do użytku wewnętrznego.

Nie należy ich wywoływać poza zajęciami.

Pola prywatne zawierają dane do użytku wewnętrznego.

Nie należy ich czytać ani zapisywać (bezpośrednio) spoza zajęć.

Uwaga: Bardzo ważne jest, aby pamiętać, że samo dodanie podkreślenia do zmiennej nie czyni jej prywatną, jest to tylko konwencja nazewnictwa.


4
przynajmniej istnieje idea pól prywatnych, ale tak naprawdę nie są one prywatne, i tak możesz uzyskać do nich dostęp. autor powyższego kodu chciał tylko, aby były prywatne. to wszystko.
Sander

Świetnie, nie wiem, dlaczego tak długo to sprawdzałem! Dzięki.
droid-zilla

21

O ile mi wiadomo, jest zwykle używany do wskazania zmiennej prywatnej (ale w rzeczywistości nie zapewnia żadnej prywatności, tylko konwencję).

Zostało to krótko omówione tutaj, chociaż są odradzane: http://javascript.crockford.com/code.html


3
Podoba mi się link: „Unikaj konwencji, które pokazują brak kompetencji”. :-)
Arek

Używam ich jako skrótów podczas debugowania, szczególnie z Obietnicami i innymi rzeczami asynchronicznymi. np. „oficjalnym” sposobem uzyskania dostępu do jakiegoś atrybutu mojego obiektu może być, myObj.getSmePromise().then( function(o) { do stuff } );ale wpisywanie w konsoli Chrome jest trudne, więc myObj._someValuezakładam, że „właściwy kod” nie będzie miał do niego dostępu - jest to jednak luksus moich współpracowników również znających tę konwencję, jeśli piszesz następny jQuery / lodash / angular / respons lub cokolwiek, nie polegałbym na tym, że wszyscy twoi użytkownicy wiedzą lub szanują to!
FredL

8

Kiedy jest używany tak _varname, jakby był tylko częścią nazwy zmiennej i nie ma znaczenia javascript. Deweloperzy używają go do określenia znaczenia lub zakresu zmiennej. W tym przypadku wygląda na to, że mówi programiście, że ta zmienna powinna być zmienną lokalną lub prywatną.

Kilka rzeczy, na które należy zwrócić uwagę, w tym konkretnym przykładzie użycie _.varnameoznaczałoby zmienną lub funkcję z biblioteką underscore.js. Można również użyć _varnamedo oznaczenia zmiennej zawierającej obiekt podkreślenia, podobnie w naszym biurze używamy $varnamedo oznaczenia zmiennej zawierającej obiekt Jquery.


4

Prawdopodobnie jest używany do oznaczania właściwości wewnętrznych / prywatnych. Podobnie jak w Pythonie prefiksowanie zmiennej znakiem podkreślenia jest łatwym sposobem poinformowania programistów, że zmienna jest wewnętrzna i lepiej jej nie modyfikować (a jeśli to zrobią, nawet niewielka aktualizacja zaangażowanej biblioteki może zepsuć sprawę).


2

Zwykle _służy do poinformowania użytkownika / programisty, że jest to zmienna prywatna / chroniona.


0

Jak wspomniano, jest to praktyka wielu programistów, i to zła. Jeśli musisz odwoływać się do konwencji takich jak ta w swoich metodach programowania, powinieneś nauczyć się języka, metod i wzorców, zanim spróbujesz użyć języka. Jeśli ktoś nie jest w stanie rozróżnić w Twoim kodzie metod publicznych i prywatnych bez użycia „podkreślenia”, oznacza to, że brakuje Ci umiejętności dokumentowania. Wiele publicznych projektów w sieci jest bardzo słabo udokumentowanych, co prawdopodobnie jest przyczyną akceptacji konwencji „podkreślenia” przez większość niedoświadczonych programistów, podczas gdy inni zdecydowali się iść za nurtem, zamiast utrzymywać formalne wzorce i metody projektowania. Jest powód, dla którego „podkreślenie” nie zostało zapisane w wersjach ES6 / 7.

Niedawno na blogu natknąłem się na menadżera ds. Oprogramowania, który stwierdził: „ Konwencja nazewnictwa podkreślenia sprawia, że ​​na pierwszy rzut oka bardzo łatwo jest stwierdzić, czy funkcja zmiennej ma być publiczna czy prywatna. ”. Moja odpowiedź brzmi: „Komentarze są jak obrazki, w tym przypadku warte są tysiąca podkreśleń.

Istnieje bezpłatne narzędzie do dokumentacji o nazwie Doxygen. Chociaż nie obsługuje on konkretnie JavaScript, może generować profesjonalną dokumentację dla twoich aplikacji JavaScript, gdy użyjesz prefiksu Doxygen w swoich komentarzach. Tworzenie aplikacji JavaScript z dokumentacją jest naprawdę proste, zarówno dla programistów, jak i użytkowników, jeśli włożysz trochę wysiłku w komentarze do kodu.

Pamiętaj, że istnieją narzędzia, które mogą usuwać komentarze i instrukcje konsoli dla „Wersji produkcyjnych”. Biorąc to pod uwagę, korzystanie z map źródłowych jest również stratą czasu i zasobów. Nie minifikuj, dopóki nie będziesz gotowy do publikacji… tj. Kompilacja deweloperska (bez minifikacji, zachowaj komentarze i instrukcje konsoli), kompilacja wydania (usuń komentarze i instrukcje konsoli oraz zminimalizuj kompilację deweloperską. Nie ma potrzeby ponownej kompilacji kompilacji deweloperskiej po jej wydaniu) jakości kodu, po prostu przygotuj go do wydania i wdróż).


2
Nie zobaczysz komentarza, chyba że spojrzysz na kod źródłowy funkcji. Jeśli używasz biblioteki / kodu innej osoby, dodaje to pewnej wartości, aby móc zobaczyć intencję metody bez czytania źródła lub dokumentacji. Imo, przedrostek podkreślenia mówi, że jest to niepubliczny interfejs API, na którym nie należy polegać.
Sam P

0

To jest niewielki dodatek. Jak już odpowiedziałem, są to pseudo prywatne zmienne. Ale jest wtedy możliwe pisanie pseudo publicznych funkcji, które mają dostęp do tych prywatnych zmiennych.

Byłem zdezorientowany przez kod współpracowników, który skutecznie zawiera to (ale bardzo głęboko w oddzielnej bibliotece):

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

Teraz masz obie y.idi y._idtę pracę i zwracasz tę samą wartość. Ale jeśli to zrobisz console.log(y), pojawia się tylko _idklucz.

wprowadź opis obrazu tutaj

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.