質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

62137閲覧

[Javascript]アンダースコアから始まる変数、関数の意味

risamiya

総合スコア33

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

3グッド

6クリップ

投稿2015/10/27 00:41

編集2015/10/27 01:17

JSのコードを見ているとアンダースコアから始まる変数名や関数名をよく見かけますが、どのような変数や関数にアンダースコアから始まる名前を付与しているのでしょうか?
公式な文法うんぬんではなく、何か暗黙のルールか作法のようなものがあるように感じます。

Waki285, kuwako, dg-planet👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

私の知る限りはプライベート変数、関数にそういう命名をすることが多いです。
JavaScript には言語仕様上のプライベート宣言がないので、値を1つ何か持つとその度に余計なプロパティが際限なく増えていきます。(あくまでライブラリ等の利用者にとって余計な)
これでは利用者に使ってほしいプロパティが埋もれてしまうので、それを防ぐ目的でプライベートであることを表現するため、_xxx という名前を使用しています。

あとは一部 AltJS 系言語がコンパイル結果として吐き出す JavaScript で、予約語やプログラマーが使用する変数との衝突を避けるため (だと思うのですが) に付与しているパターンもありそうです。
(TypeScript のコンパイラが作る _this 変数など)

投稿2015/10/27 00:57

tozjp

総合スコア790

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

risamiya

2015/10/27 05:03

ご回答ありがとうございます。 なるほど、プライベートですかー。 >関数にそういう命名をすることが多いです。 多い、ということは、プライベート変数、関数以外のときもアンダースコアを付与するケースがありますか?
tozjp

2015/10/27 07:48

多いというのは、絶対にそうするわけではないという意味です。 実際、私はめったにやりません。 不特定多数に対して提供するようなライブラリを作る場合くらいですね。 > プライベート変数、関数以外のときもアンダースコアを付与するケースがありますか? このご質問にだけお答えすると、上記回答の AltJS もそうですし、おそらく世の中ごまんという人が自分ルールで _ から始まる変数名を考えているでしょうが、取るに足らないものです。 一般的によく受け入れられているものとしてはプライベートの意味くらいといっていいと思います。
guest

0

db のカラム名は、アンダースコアで区切った名前が多い。
css はハイフンで区切った名前がある。
java , javascriptはハイフンを名前の一部に使えないが代わりにアンダースコアを使う。

ABC_EFG というdbのカラムがあるとき、dbのカラム名からJAVA のGETTER OR SETTER を特定したい、なんて場合、javaでは、アッパーキャメルケースで変換して、get / set を頭に付ける。
キャメルケースでgetter/setter を定義しない方言もあるので一概には言えないけど、アンダースコアの直後の1文字がアルファベットのとき、その1文字を大文字、残りは全部小文字で、なんて規約にすれば、dbから取得したデータをbean に自動的に突っ込める、これ便利。ABC_1DE とか、アンダースコアの直後が数字の場合はどうすんだ、とか、AB12W とか、数字を含むけど、アンダースコアが名前に入ってないとかの場合はどうすんだ、とか細かいことあるけど、それぞれ適切に対応することで自動化という点でアンダースコア入り文字列とjava の雰囲気を鑑みた相互変換が可能になったりします。暗黙のルールという点ではキャメルケース変換によるコピー、初期化処理は、よくあることです。エクリプスのgetter/setterの変換ルールも、単純に先頭だけ大文字変換あとは触らない、でしたね。キャメルの反対はスネークなんですって。

コンパイラは、定義されている変数名、関数名、の先頭にアンダースコアを1個付けます。なので、リストみるとアンダースコアだらけです。c言語だと、プリプロセッサのキーワードは、アンダースコア2つ前に付けます。付いてないのも一杯あるので一概には言えませんけど。アンダスコアの付き方と文字の大小でコード中のキーワードの分類がやり易そうです。

いぜんのプロジェクトでは、インスタンス変数名の末尾にだけにアンダースコアを付ける独特なルールがあったのでとても萎えました。
getAbcDef()
とかいかにもjava っぽいでしょ。javascript だけやってる人はまず居ないので、それぞれ記述する人の背景にこれまで学んできた言語がアンダースコアの付け方でみえてきたりすると面白いですね。
アンダースコアを変数の末尾に付ける書き方、アセンブラで見たことがありました。c言語が前なんで、cんp変数と区別するためかなぁ。

投稿2015/10/27 08:33

ipadcaron

総合スコア1693

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

_ から始まる名前が private である」というのは一部のコーディング規約でそのように規定されているだけで全てのコーディング規約がそうなっているわけではありません。
例えば、「Google JavaScript Style Guide」では _ で終わるプロパティを private と定義しています。

コーディング規約はチームでコーディングする為の「暗黙の了解」ですが、チームによって準ずるコーディング規約も変化します。
一人でコーディングするのであれば自由に書いて構いませんが、一つのコーディング規約に沿ってコードを書けばメンテナンス製の高いコードを期待できます。


"_" で始まる名前を付けても実際に private になっているわけではない
当然の事ながら名前を変えたから自動的に private になるわけではありません。
Object.defineProperty{enumerable: false} を指定するとか、getter/setter 的にして private にしなくて済むようにするとか、確実に問題が解消される方法を模索してどうしても解消されない時に暫定対応として命名規約で縛るものだと思います。

"_" な関数
Underscore.js や lodash.js は _ という名前の関数をグローバル空間に持ちますが、質問されているのはそれの事ではないですよね?(違うとは思いますが、念のため)

投稿2015/10/27 05:42

think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

risamiya

2015/10/28 02:32

ご回答ありがとうございます。 参考になります。 GoogleのJSスタイルガイドは読んだことなかったので、読んでみます! >Underscore.js や lodash.js は _ という名前の関数をグローバル空間に持ちますが、質問されているのはそれの事ではないですよね?(違うとは思いますが、念のため) ご認識の通り、違いますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問