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)なぜそれらを使用するのですか?


2
下線には構文上の意味はありません。おそらく、その特定のプログラマーが変数のタイプを示すための
規則

回答:


164

プライベートフィールドまたはプライベートメソッドを意味します。内部使用のみを目的としたメソッド。

クラスの外部で呼び出すことはできません。

プライベートフィールドには、内部で使用するためのデータが含まれています。

クラスの外部から(直接)読み書きすることはできません。

注:変数にアンダースコアを追加するだけでは非公開にはならず、命名規則にすぎないことに注意することが非常に重要です。


4
少なくとも、プライベートフィールドのアイデアはありますが、実際にはプライベートではないので、とにかくアクセスできます。上記のコードの作者は、彼らがプライベートであることを意図していました。それで全部です。
サンダー

すごい、なぜこれを調べるのにこんなに時間がかかったのかわからない!ありがとう。
droid-zilla 2015年

21

私の知る限り、これは一般にプライベート変数を示すために使用されます(ただし、実際にはプライバシーを提供するものではなく、単なる慣例です)。

ここでは簡単に説明しますが、次のことをお勧めします:http//javascript.crockford.com/code.html


3
私はリンクが好きです:「能力の欠如を示す慣習を避けてください。」:-)
アレック2015

特にPromisesやその他の非同期のものを使用して、デバッグ時のショートカットとして使用します。たとえば、オブジェクトの一部の属性にアクセスする「公式」の方法myObj.getSmePromise().then( function(o) { do stuff } );は、Chromeコンソールで入力するのが面倒なのでmyObj._someValue、「適切なコード」では実際にはアクセスできないことを理解しました。ただし、これは次のようになります。次のjQuery / lodash / angular / reactを書いている場合、またはこれを知っている、または尊重しているすべてのユーザーに依存しない場合は、この規則を知っている同僚の贅沢もあります。
FredL 2016年

8

のように使用すると _varname変数名の一部であるかのにと、JavaScriptの意味はありません。開発者は、変数の意味またはスコープを示すためにこれを使用します。この場合、この変数はローカル変数またはプライベート変数である必要があることを開発者に伝えているように見えます。

この特定の例で使用_.varnameするいくつかの注意点は、underscore.jsライブラリを使用する変数または関数を意味します。また_varname、アンダースコアオブジェクトを保持する変数を示すために使用することもできます。同様に、私たちのオフィスでは$varname、Jqueryオブジェクトを含む変数を示すために使用します。


4

おそらく、内部/プライベートプロパティをマークするために使用されます。Pythonの場合と同様に、変数にアンダースコアを付けるのは、変数が内部であり、改ざんしない方がよいことを開発者に伝える簡単な方法です(そうすると、関連するライブラリを少し更新しただけでも問題が発生する可能性があります)。


2

通常_、それが問題のプライベート/保護された変数であることをユーザー/プログラマーに伝えるために使用されます。


0

述べたように、それは多くの開発者の間の慣習であり、それは悪いことです。プログラミングメソッドでこのような規則に頼る必要がある場合は、言語を使用する前に、言語、メソッド、およびパターンを学習する必要があります。「アンダースコア」を使用せずにコード内のパブリックメソッドとプライベートメソッドを区別できない場合は、ドキュメントのスキルが極端に不足しています。Web上の公開プロジェクトの多くは文書化が非常に不十分であるため、「アンダースコア」の規則がほとんどの教育水準の低い開発者に「受け入れられ」、他の人は正式なデザインパターンと方法を維持するのではなくフローを採​​用することにしました。ES6 / 7バージョンに「アンダースコア」が書き込まれなかったのには理由があります。

最近、あるブログで、ソフトウェアエンジニアマネージャーに次のように述べています。「アンダースコアの命名規則により、変数関数がパブリックかプライベートかが一目でわかります。」私の回答は次のとおりです。「コメントは写真のようなものです。この場合、コメントは1000アンダースコアの価値があります。

Doxygenと呼ばれる無料のドキュメントツールがあります。特にJavaScriptをサポートしていませんが、コメントでDoxygenプレフィックスを使用すると、JavaScriptアプリケーションの専門的なドキュメントを生成できます。コードコメントに少し力を入れれば、開発者とユーザーの両方にとって、ドキュメントを使用してJavaScriptアプリケーションを作成するのは本当に簡単です。

コメントを削除できるツールや、「本番リリース」のコンソールステートメントがあることを忘れないでください。そうは言っても、ソースマップの使用は時間とリソースの浪費でもあります。公開する準備ができるまで縮小しないでください。つまり、Dev Build(縮小なし、コメントとコンソールステートメントを保持)、Release Build(コメントとコンソールステートメントを削除し、Devビルドを縮小します。リリース時にDevBuildを再コンパイルする必要はありません。高品質のコード。リリース用に準備してデプロイするだけです)。


2
関数のソースコードを見ない限り、コメントは表示されません。他の誰かのライブラリ/コードを使用している場合は、ソースやドキュメントを読まなくてもメソッドの意図を確認できるように、何らかの価値が追加されます。アンダースコアプレフィックスのImoは、これは非公開のAPIであり、信頼すべきではないことを示しています。
サムP

0

これはちょっとした補遺です。すでに答えたように、これらは疑似プライベート変数です。しかし、これらのプライベート変数にアクセスする疑似パブリック関数を作成することは可能です。

私はこれを効果的に持っている同僚のコードに混乱しました(しかし、別のライブラリに非常に深く埋め込まれています):

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

今、あなたは両方持っているy.idy._idその仕事をし、同じ値を返します。しかしconsole.log(y)_idそうすると、キーが表示されるだけです。

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.