Что означает это подчеркивание в 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();
    },

Я читаю руководство по backbone.js здесь: http://addyosmani.com/blog/building-spas-jquerys-best-friends/

Какие подчеркивания? (_index, _photos, _album) Зачем их использовать?

TIMEX
источник
2
подчеркивания не имеют синтаксического значения, вероятно, это соглашение для конкретного программиста, чтобы обозначать тип переменных,
Нейт Коппенхейвер

Ответы:

164

Это означает частные поля или частные методы. Методы, предназначенные только для внутреннего использования.

Их не следует вызывать вне класса.

Частные поля содержат данные для внутреннего использования.

Их нельзя читать или записывать (напрямую) вне класса.

Примечание. Очень важно отметить, что простое добавление символа подчеркивания к переменной не делает ее частной, это всего лишь соглашение об именах.

DrStrangeLove
источник
4
по крайней мере, идея частных полей есть, но они не совсем частные, вы все равно можете получить к ним доступ. автор приведенного выше кода предназначен только для того, чтобы они были конфиденциальными. это все.
Sander
Потрясающе, не знаю, почему я так долго искал это! Благодарю.
droid-zilla 07
21

Насколько мне известно, он обычно используется для обозначения частной переменной (но на самом деле не обеспечивает никакой конфиденциальности, а просто соглашение).

Здесь это кратко обсуждается, хотя их не рекомендуется: http://javascript.crockford.com/code.html

Оли
источник
3
Мне нравится ссылка: «Избегайте условностей, демонстрирующих некомпетентность». :-)
Арек
Я использую их как ярлыки при отладке, особенно с обещаниями и другими асинхронными функциями. например, "официальный" способ доступа к некоторому атрибуту моего объекта может быть, myObj.getSmePromise().then( function(o) { do stuff } );но набирать его в консоли Chrome затруднительно, поэтому я исходил myObj._someValueиз того, что "правильный код" на самом деле не получит к нему доступа - это, однако, с роскошь моих коллег, также знающих это соглашение, если вы пишете следующий jQuery / lodash / angular / react или что-то еще, я бы не стал полагаться на то, что все ваши пользователи знают или уважают это!
FredL
8

При использовании, как будто _varnameэто просто часть имени переменных и не имеет значения javascript. Разработчики используют его для обозначения значения или области действия переменной. В этом случае похоже, что он сообщает разработчику, что эта переменная должна быть локальной или частной.

Несколько замечаний: в этом конкретном примере использование _.varnameбудет обозначать переменную или функцию с библиотекой underscore.js. Также можно использовать _varnameдля обозначения переменной, содержащей объект подчеркивания, аналогично в нашем офисе мы используем $varnameдля обозначения переменной, содержащей объект JQuery.

Райан Гиббонс
источник
4

Вероятно, он используется для обозначения внутренних / частных свойств. Точно так же, как в python, префикс переменной с подчеркиванием - это простой способ сообщить разработчикам, что переменная является внутренней, и им лучше не вмешиваться в нее (и если они это сделают, даже незначительное обновление задействованной библиотеки может что-то сломать).

ThiefMaster
источник
2

Обычно _используется, чтобы сообщить пользователю / программисту, что это частная / защищенная переменная.

Ян Драгсбек
источник
0

Как уже упоминалось, это практика многих разработчиков, к тому же плохая. Если вам приходится прибегать к подобным соглашениям в ваших методах программирования, вам следует изучить язык, методы и шаблоны, прежде чем пытаться использовать язык. Если кто-то не может отличить общедоступные / частные методы в вашем коде без использования «подчеркивания», то вам крайне не хватает навыков документирования. Многие общедоступные проекты в сети очень плохо документированы, что, вероятно, является причиной того, что соглашения о «подчеркивании» были «приняты» большинством малообразованных разработчиков, в то время как другие решили плыть по течению, а не придерживаться формальных шаблонов и методов проектирования. Есть причина, по которой «подчеркивание» не было написано в версиях ES6 / 7.

В блоге я недавно наткнулся на менеджера по программному обеспечению, который заявил: « Соглашение об именах с подчеркиванием позволяет с первого взгляда легко определить, предназначена ли функция переменной быть открытой или частной. ». Мой ответ: «Комментарии похожи на картинки, в данном случае они стоят тысячи подчеркиваний.

Существует бесплатный инструмент документации под названием Doxygen. Хотя он специально не поддерживает JavaScript, он может создавать профессиональную документацию для ваших приложений JavaScript, если вы используете префикс Doxygen в своих комментариях. Создавать приложения JavaScript с документацией действительно просто как для разработчиков, так и для пользователей, если приложить немного усилий в комментарии к коду.

Помните, что есть инструменты, которые могут удалять комментарии и консольные операторы для «Рабочих версий». При этом использование исходных карт также является пустой тратой времени и ресурсов. Не уменьшайте до тех пор, пока не будете готовы к публикации .. т.е. Dev Build (без минификации, оставляйте комментарии и консольные операторы), Release Build (удалите комментарии и консольные операторы и минимизируйте Dev-сборку. Нет необходимости перекомпилировать Dev Build после ее выпуска качественный код, просто подготовьте его к выпуску и разверните).

BeosFreak
источник
2
Вы не увидите комментарий, если не посмотрите исходный код функции. Если вы используете чужую библиотеку / код, это добавляет некоторую ценность, позволяя увидеть намерение метода без чтения источника или документации. Имо, префикс подчеркивания говорит о том, что это непубличный API, на который нельзя полагаться.
Sam P
0

Это небольшое дополнение. Как уже было сказано, это псевдоприватные переменные. Но тогда можно написать псевдопубличные функции, которые обращаются к этим частным переменным.

Меня смутил код коллег, в котором это фактически есть (но очень глубоко похоронено в отдельной библиотеке):

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

Теперь у вас есть y.idи y._idто, и другое , и они возвращают одно и то же значение. Но если вы это сделаете, console.log(y)появится только _idключ.

введите описание изображения здесь

icc97
источник