- ベストアンサー
これは名前空間ですか?それとも変数?オブジェクト?
・名前空間が分からないので教えてください ・下記例で、Hogeは何に該当するのでしょうか? ・Hoge.getPerson()と呼んでいるので、グローバル環境に生成した名前空間? ・それとも、var宣言しているので、ローカル変数? ・あるいは、ドットで繋いでいるので、オブジェクト? ・もしかして、「名前空間」であり「変数」であり「オブジェクト」でもある? var Hoge = (function(){ //中略 return { getPerson: _getPerson }; }()); Hoge.getPerson(); ・名前空間って何ですか?
- re97
- お礼率80% (601/744)
- JavaScript
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
Hoge はグローバルスコープの変数で、 変数が指し示すのが名前空間「っぽい」オブジェクトです。 そもそも JavaScript には言語的に名前空間がありませんが、 慣習的に名前空間「っぽい」オブジェクトの書き方があります。 この名前空間「っぽい」オブジェクトを導入する利点としては、 ・他人の作ったスクリプトと並存したときの危険性が下がる (グローバルスコープの汚染が少ないので変数名が被りづらい) ・関連する変数や関数が集まっているので管理がしやすい ・コーディングが綺麗になる (全ての関数名に長ったらしい前置詞を強制されない) があるので、ある一定の規模のライブラリを作るなら採用するのが常識になっているようです。 jquery.js なら $ とか jQuery とかですね。 Hoge.getPerson() の挙動ですが、詳しく整理するならば グローバルスコープの変数 Hoge → が指し示すオブジェクト (即時関数の戻り値である名前空間っぽいオブジェクト) → のプロパティ getPerson → が指し示すオブジェクト(ローカルスコープの_getPersonに入っていた関数オブジェクト) → を実行 余談ではありますが、 Hoge というのは命名規則的にどうかと思います。 JavaScript は一応は Java っぽい言語なので、命名規則も大体は Java に準じています。 で、Java の推奨される命名規則といえば、 パッケージ: hoge.boke クラス: HogeBoke 関数名: doHogeBoke 変数名: hogeBoke 定数名: HOGE_BOKE ですので、JavaScript でも名前空間っぽいオブジェクトは hoge とすべきでしょう。
関連するQ&A
- 即時関数でプライベート変数的になってる理由を教えて
即時関数内で、プライベート変数的な動きになっている(?)コードがあるのですが、呼び出せない理由を教えてください ・呼び出せる例1 (function() { hoge2 = 'ホゲ2'; })() console.log(hoge2); ・呼び出せる例2 (function() { var hoge1 = {}; hoge2 = 'ホゲ2'; })() console.log(hoge2); ・呼び出せない例 (function() { var hoge1 = {},hoge2 = 'ホゲ2'; })() console.log(hoge2); ■質問1 ・どうして呼び出せないのでしょうか? ・varでローカル宣言(?)してるhoge1オブジェクトに紐づいているから? ・つまり、hoge2オブジェクトを生成している場所が違う? ■質問2 ・呼び出せない状態の時、hoge2はプライベート変数になっているのでしょうか? ■質問3 ・そもそもどうして呼び出せるのでしょうか? ・即時関数は(名前もしくはスコープ)空間を作り閉じ込めるので~、という記述を、どこかで見かけたような気もするのですが…
- ベストアンサー
- JavaScript
- 【jquery】即時関数について
知識のある方に教えて頂きたく、貴重なスペースをお借りいたします。 $(function(){ })と、即時関数の(function(){})();は 何が異なるのでしょうか。 よくグローバルオブジェクトの汚染を防ぐ為に 即時関数を使用すると記載がありますが、 通常JSを記載する際に使用する、DOM構築後に実行をする記述 $(function(){ })も、結局変数などをVar宣言すれば、 ローカル変数になるので、同じこと(グローバルの汚染を防げる) ではないかと思うのですが、間違っておりますでしょうか。 それだとすると、即時関数の使い道がわからないのですが、 ご教示頂けますでしょうか。 また、以下の(1)の記述方法だと、 「hoge」はグローバルオブジェクトとなってしまいますが、 (2)だとなりませんよね。 であれば、基本的には(2)のように関数は記載した方が良いのでは ないのでしょうか。結構(1)の書き方をしている方がいるので。 どなたかご教示いただければ幸いです。 よろしくお願いいたします。 ----------------------- (1) $(function(){ hoge(); }) function hoge(){ return true; } ----------------------- ----------------------- (2) $(function(){ hoge(); function hoge(){ return true; } }) -----------------------
- 締切済み
- JavaScript
- return の中はローカルスコープ?
return 範囲内における、ローカル / グローバルスコープについて教えてください ■質問 ・returnするまではローカル変数? ・returnしたらグローバル変数? ・それとも、「return の中」というスコープは存在しない? ■例1 (function(){ return{ //ローカルスコープ? //ここで定義した変数はローカル変数? } })(); ■例2 (function(){ return{ hoge : (function(){ //ローカルスコープ? //ここで定義した変数はローカル変数? })() }; })();
- 締切済み
- JavaScript
- jqueryのグローバル変数とローカル変数
知識のある方に教えて頂きたいことがございます。 jqueryを何気なく組んでいたもので、基礎的なことがわかっておらず ご教示頂きたいのですが、 下記に記述した変数の(1)~(6)をどれが グローバル変数で、どれがローカル変数なのかご教示いただけますでしょうか。 関数の中は全てローカル変数になるという事を聞いたので、(3)と(4)はローカル変数、 プラグイン自体関数なので、(5)と(6)はローカル変数 (1)と(2)はグローバル変数だと考えておりますが、あっていますでしょうか。 どうかよろしくお願い致します。 $(function(){ var a = 0;//(1) b = 0;//(2) function Kansu(){ var c = 0;//(3) a = 1;//(4) } }) /* ----------------------------------------- */ (function($){ $.fn.testPlugin = function(options){ var d = 0;//(5) e = 0;//(6) } });
- ベストアンサー
- JavaScript
- javascriptのコードについて
以下のコードなのですが、 エンクロージャー関数の ローカル変数hogeをさらに、エンクロージャー内部で定義された 関数ででクロージャーとして保持させたいメソッドのコードですが var Method = function (){ var hoge = "初期値"; var getter = function (){ return hoge; } var setter = function (param){ hoge = param; return hoge; } return {"set" : setter,"get" : getter} } var obj = Method(); console.log(obj); console.log(obj . get()); obj.set("初期値変更"); console.log(obj.get()); obj . set("更に変更"); console.log(obj.get()); この場合、メソッドの返り値として、一般的な文献に乗っている関数(関数オブジェクト)を返すのではなく オブジェクトリテラルとして返しています。 この場合でも、動きとしてはクロージャーの動きをしているのでhogeという変数の保持はできているっぽいんですが クロージャーって関数内で定義された関数であれば、どういう返り値の返し方でも クロージャーになるのですかね? また、この方法は、一般的にjsで関数コンストラクタ呼び出しをしてインスタンスを作る際privateメンバを実現する方法として紹介されていますが、 これはクロージャーとして生成するたんびに内部の変数を保持するためメモリ食い虫になるらしいのですが まず間違いなく、このクラス(便宜上そう呼びます)のインスタンスはひとつしかつくることはない!!という仕様だとしても いけないのでしょうか? というかもう現状javascripのバッドノウハウ的なものになっているのでしょうか?
- ベストアンサー
- JavaScript
- 同じ名前の変数…
数日前からPHPをはじめた者です。 クラス変数(という呼び方が適切かは??)と、その変数に値をセット/ゲットする関数を内包するクラスを作ってみたのですが、それに関してどうもピンと来ない部分があるので質問させてください。 以下がソースです。 class sample{ var $hensu; function set_hensu($str){ $hensu = $str; } function get_hensu(){ return $hensu; } } 上記クラスを使って値のセット/ゲットをしようとしたのですが、結果は×でした。 ファンクション内の変数を、thisで指定するとうまく行きました。 最初に指定した変数と、ファンクション内の変数を同一のものだと認識させるには、ファンクション内でのthis指定の他に方法は無いのでしょうか? もしくは、ファンクション内で書いた変数が新しい変数だと認識させない方法とか…。 無いなら諦めます。よろしくお願いします。 また、直接質問とは関係ないのですが、 どうしてPHPは変数名を書いただけで変数が作られてしまうのでしょう。メリットは何ですか? 分かりづらくて戸惑ってます。
- ベストアンサー
- PHP
- JavaScriptでインスタンスを比較してみたい
JavaScriptでインスタンスを比較してみたいのですが、色々分からないことがあるので教えてください。 ■質問1 ・そもそも、JavaScriptにインスタンスはあるのでしょうか? ■質問2 ・下記で「hoge1」「hoge2」はインスタンスではないのでしょうか?(単にオブジェクトを取得しているだけ?) var myApp = { point: 0, setPoint: function(p){ this.point= p; }, getPoint: function(){ return this.point; } }; myApp.point = 5; var hoge1 = myApp.getPoint(); var hoge2 = myApp.getPoint(); console.log( hoge1 === hoge2 ); // true ■質問3 ・「Object.create」か「new」すれば、インスタンス生成できる? ■質問4 ・インスタンスの比較はどうやるのでしょうか? ・「===」?
- ベストアンサー
- JavaScript
- オブジェクトの中で呼び出される順番とデフォ引数?
・意味が分からないコードがあるので教えてください ■コード var arg; var obj = { hoge : function( arg ) { var hoge = function(arg){ return function() { } }(arg); hoge(); } } ■質問 ・この時、obj.hoge(arg);と書いたら、どういう処理が走るのでしょうか? ・初めに実行されるのは? 無名関数部分? それともhoge()? ・hoge()を実行する際、引数指定していないので、引数は渡らない?
- ベストアンサー
- JavaScript
- オブジェクトの消滅と関数の戻り値オブジェクト
public sub test1() { dim hoge as classX = tes2() test2.getHogehoge() } public Function test2() as classX { dim ret As New classX("初期化") return ret } 大変簡略化してますが上記2つの関数があった場合 関数test1でclassX型のアドレスhogeに、test2()が返す classX型オブジェクトの参照を代入しています。 でこの実体というかインスタンスretはtest2()の中の スコープで消滅する自動変数として生成されています。 んで実際関数test2を抜けるときretのインスタンスは 破棄されるのにtest1ではそれをhogeアドレスに代入して 使用していいのでしょうか?
- 締切済み
- Visual Basic
- クラス、メソッド、プロパティ、変数などの意味は?
いろんなサイトやネットでいろいろ調べたのですが、 よく分かりませんでした。自分なりに考えたことですが、 (1)~(6)の用語の内容とコード上での色付けは正しいでしょうか? (1)クラス(緑枠) コンストラクタ、メソッド、プロパティを一括りにまとめたパッケージのこと。 つまり、functionの【{】と【}】の間にあるもの。 (2)オブジェクト(青枠) 関数。すなわち「複数の物や動作を入れる物」。 つまりfunctionで始まるものをオブジェクトと呼ぶ。 (3)コンストラクタ(= クラス名または関数名)(紫枠) 「構築子」のこと。オブジェクトを作る名前の部分。 つまりfunction直後に付ける関数名(クラス名)をコンストラクタと呼ぶ。 (4)プロパティ(赤枠) 「特徴」のこと。 つまりfunction内で指定された変数(var b)をプロパティと呼ぶ。 function a(){var b;}; (5)メソッド(水色枠) 「動作」のこと。 つまりオブジェクト(functionで始まるもの)が 変数(var b)に指定された場合はメソッドと呼ぶ。 var b = function a(){}; (6)変数(灰色枠) function外で指定された変数(var b)は、変数と呼ぶ。 function a(){}; var b;
- ベストアンサー
- JavaScript
お礼
回答ありがとうございました。 >Hoge はグローバルスコープの変数で、 >変数が指し示すのが名前空間「っぽい」オブジェクトです。 >そもそも JavaScript には言語的に名前空間がありませんが、 >慣習的に名前空間「っぽい」オブジェクトの書き方があります ・説明分かりやすかったです ・命名規則アドバイスもありがとうございました ・大変参考になりましたー