
javascriptを勉強し始めた初心者です。
『名前空間』の意味が分からずインターネットで調べてみましたが
自分にはぼんやりとしか理解できませんでした。
対象(言語)ごとに少し解釈が異なったりするのですか?
javascriptに限ってではなく、プログラムにおける名前空間とは何か、
という事をなんとなくでも理解したいです。
名前空間とは何かをわかりやすく説明していただける方、どうかご回答ください。
できれば小学生でもわかるような簡単な例え話と併せて、
実際のサンプル等も用いて説明してくださると非常に助かります。
よろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
JavaScriptに名前空間は存在しません。
名前空間とは、#1で既に回答がある通り、対象のクラス、命令などを
決定する住所みたいなもんです。
http://programming-10000.hatenadiary.jp/entry/20 …
ここでは「JSTEST」という名前空間を実現する為の方法のように記されていますが、
これはどちらかというと名前空間ではなく「オブジェクト」の中に、「Person」クラスが
定義されているにすぎません。
それによって、『一意となる住所を作りだしている』に過ぎないのです。
その為、このページでも
var person = JSTEST.Person;
などとしていますが、いちいち使いたいクラスを別変数に格納してあげる必要があります。
厳密にいうと格納してあげる必要はありませんが、Personクラスが存在する位置が
JSTEST.ABC.DEF.GHI.JKL.MNO.PQR.Personだとしたら、毎度毎度それを書いてあげなければ
Personを特定させることができないから、別変数に格納し直しています。
名前空間の概念は以下の通りです。
A県A市の山田
A県B市の山田
この2つの情報から、A県A市の山田をどうのこうのしようとしたいと考えた時、
以下2つのパターンが存在します。
・そもそもA県A市しか対象として考えていない場合
・A県A市、A県B市ともに対象として考える場合
前者の場合、いちいちA県A市であることを考えなくてもいいことになります。
後者の場合、「山田」はA県A市であることを明示しなくてはなりません。
JavaScriptでは前者の振る舞いはできません。
なぜなら名前空間という概念が存在しないから。
でもみんなその概念を欲しがるから作っているだけで、JavaScriptの概念としては
存在しません。
だから自前で作った『名前空間』が、他のライブラリなどのものとぶつかると
正しく動作させることができません。
No.3
- 回答日時:
本当の意味ではイロイロあるんでしょうが、素直に「名前をかぶらせない仕組み」と覚えるのが簡単です。
複数人でソフト開発をすると、関数名やクラス名の名前かぶりが発生する可能性があります。
例) 太郎さんと calc_kiriage を実装 → 次郎さん calc_kiriage を実装 → コンパイルエラー!
これを避けるために、命名規則を設けて名前がかぶらないように調整します
例) 太郎さんは TARO_calc_kiriage を実装 → 次郎さん JIRO_calc_kiriage を実装 → OK
しかしこれでは、名前が無駄に長くなる可能性があります
例) えぐざんぶる株式会社の銀行向けソフトの金額計算関数 EXAMPLE_CO_BANK_LIB_KEISAN_kiriage
だからといってコード化して短縮するのも感心しません
例) えぐざんぶる株式会社(C1)の銀行向けソフト(S2)の金額計算(F3)関数 C1S2F3_kiriage
そこで言語仕様として用意されている名前空間を使えば
例) えぐざんぶる株式会社の銀行向けソフトの金額計算関数 jp.co.exmaple.bank.lib.keisan.Kiriage
名前空間の省略記法が使えるので、書きやすく読みやすいコードになります
例) import jp.co.exmaple.bank.lib.keisan.*;
例) Kiriage obj; // jp.co.exmaple.bank.lib.keisan.Kiriage と同様
さて JavaScript には名前空間が言語仕様として存在しません。
なのでオブジェクトを多段定義して名前空間「っぽい」書き方をすることを、名前空間と呼ぶのが普通です。
例) var name = { space:{ func:function(){return name.space.value}, value:123 } };
例) name.space.func(); // 123
名前空間の省略記法「っぽい」も可能です。
例) var f = name.space.func;
例) f(); // 123
JSDoc も書いとけば万全でしょう
例) /** @namespace えぐざんぶる株式会社の名前空間 */ var example = {};
例) /** @namespace ダイジェスト計算の名前空間 */ example.digest = { calc:function(){} };
No.1
- 回答日時:
基本的に概念として存在します。
言語によって扱いも実装も違います。
簡単にいえば、変数名などがどこに存在しているかを考える概念です。
これが不適切だと、変数の中身があらぬところで書き変わったり、呼び出せなかったりします。
たとえば、「太郎」という名前だけでは個人を特定することはできません。
しかし、「東京都○○区○○▲▲ 佐藤家」という名前空間に属する「太郎」ということであれば特定が可能。
この「東京~~」が名前空間だと考えればわかりやすいはずです。
実際には宣言や参照のこともあるんでこのままってわけではないですが・・・。
上記の通り言語で扱いは変わります。
というか概念なので、明示的に名前空間と呼ばない言語もあります。
JavaScriptにおいては、名前空間自体よりもスコープが重要です。
複数の関数に同じ名前の変数を作ってみて、それぞれコールしてみるとわかりやすいかもしれない。
*スコープは、参照できる範囲と考えればいいです。
Ex1)
function foo(){
var hoge = "huga";
}
function bar(){
var hoge = "geko";
}
どちらの関数でもhogeを使っていますが、それぞれスコープが違うために中身は別です。
また、スコープが関数内に存在するため関数外からは参照できません。
関数foo()とbar()を順番に実行したとしても、alertなどでhogeを出力した場合はundefinedになります。
Ex2)
var hoge = "boko";
function foo(){
hoge = "huga";
}
function bar(){
hoge = "geko";
}
Ex1との違いは、関数の外で変数が宣言されています。
この場合、名前空間がグローバル(スクリプト全体って考えるといいかな)となります。
そのため、foo()とbar()で使われているhoge変数は、グローバルに宣言していあるhogeと同じものになります。
foo()を実行すれば、中身がbokoだったhogeの中身はhugaに、bar()の場合はgekoになります。
スコープもグローバルになりますから、その時の内容が出力されます。
オブジェクト指向言語の場合、インスタンスでの扱いなどでさらに複雑になったりします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 留学・ワーキングホリデー リスニング力、はつきますか?6カ月語学学校行き数年間お金を稼いでまた、6カ月間語学留学に行くのは? 1 2023/02/11 15:49
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- 日本語 「~人」と「~名」の使い分け 2 2022/06/02 11:59
- 日本語 〈場所を示す「に」と「で」〉 という誤り 36 2022/11/12 15:04
- 文学・小説 かなり前に読んだ小説の題名が思い出せなくて困ってます。漠然とした曖昧な記憶ですが、心当たりのある方い 1 2022/05/21 15:22
- その他(社会・学校・職場) 平均的日本人の頭は悪くはないはずですし、学校で習う内容が幼稚というわけでもないのに、世間には幼稚な大 7 2023/04/05 20:51
- 高校 勉強ができない。 4 2022/07/03 08:13
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- 日本語 「に」について 9 2022/10/25 16:32
- その他(悩み相談・人生相談) 仕事でわからないことがあるとパニックになり、生きていく自信すらなくしてしまう 3 2022/06/06 21:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
自動でリンクを実行する
-
MFCのキャプション変更
-
ifreamをリロードしたい
-
Vb.netのグローバル変数の宣言...
-
jQuery 変数を複数のセレクタ...
-
ASP+アクセスでのSQLコメントに...
-
Boolean型配列中のTrueの有無を...
-
サブウインドウから親ウインド...
-
Linux バイナリ実行できない "...
-
window.onloadでのfunction
-
同じ型【ハイフンと数字】だけ...
-
HTTPSのとき":"が"%3A"ではなく...
-
IE6.0でのオブジェクト座標の動...
-
JavaScriptで文字列の置き換え
-
<a>タグのテキストを取得
-
Latexに関する質問です。
-
document.onkeydownについて
-
jQuery UI Accordion Plugin(jQ...
-
シンプルなweb版スタンプラリー...
-
URLのパラメータを取得しリンク...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Boolean型配列中のTrueの有無を...
-
HTTPSのとき":"が"%3A"ではなく...
-
ボタンをクリックすると数が増...
-
Linux バイナリ実行できない "...
-
ASP+アクセスでのSQLコメントに...
-
Excel VBA の ChangeFileAccess
-
アンカーリンクをクリックさせ...
-
javascriptで文字挿入でtoggle...
-
ifreamをリロードしたい
-
static と externについて
-
同じ型【ハイフンと数字】だけ...
-
【正規表現】【javascript】CR...
-
System::Drawing::Color::XXXX...
-
MFCのキャプション変更
-
VB.NETで変数の型は自作...
-
【Jquery】changeイベント毎にa...
-
サブウインドウから親ウインド...
-
Vb.netのグローバル変数の宣言...
-
window.onloadでのfunction
-
hogehogeの由来
おすすめ情報