No.3ベストアンサー
- 回答日時:
グローバル変数を多用すると名前衝突の危険が跳ね上がります。
例) ページ内の広告用スクリプトが使うグローバル変数と偶然同じ名前
例) ページ内で共存するライブラリが使うグローバル変数と偶然同じ名前
例) var をつけ忘れた関数内作業用変数と偶然同じ名前
例) デバッグ用に用意した関数と偶然同じ名前
例) 自分が書いた別のグローバル変数と偶然同じ名前
例) A処理をコピーしたB処理を書いて両方を共存させる
グローバル汚染と呼ばれるこの現象は、歴史的経緯もあり、いとも簡単に発生し不可解な障害原因となりえますので、できるかぎりグローバル変数を使わないことがよい設計とされています。
案1改. 名前空間と with 構文を使う
var MYNS = {}; // 名前空間
MYNS.hs = [ ... ];
function fn(){
_ with(MYNS) { // strict モードではエラー扱いなので注意
_ _ document.write(hs[0].name);
_ }
}
fn();
案5. モジュール機構を使う
// a.js
export const hs = [ ... ];
// b.js
import {hs} from 'a.js';
export function fn(){ document.write(hs[0].name) }
// main.js
import {fn} from 'b.js';
fn();
理想的にはこれが一番ですが、環境が整っている前提確認が必要
参考
https://developer.mozilla.org/ja/docs/Web/JavaSc …
かなり簡単にやばい状況に陥ってしまう事が分かりました。
案1改、案5と安全策を考えていただきましたが、そもそも私の些細なこだわりを捨てて、fn(hs)と引数を渡せば、解決する事なのですよね^^
よって見事にこだわりを捨てる方向へ誘導していただきました^^
No.2
- 回答日時:
安易にグローバル変数を多用するのは危険ですので、
少々面倒となりますが以下の方式でいかがでしょうか。
案1. 名前空間パターンで参照
var MYNS = {}; // ただ一つのグローバル変数を作り名前空間とみなす
MYNS.hs = [ ... ];
function fn(){ document.write(MYNS.hs[0].name) }
fn(); // グローバル変数である名前空間内の定数を参照可能
案2. クロージャーから参照
(function(){ // 即時関数
_ var hs = [ ... ]; // 即時関数内の変数 ≠ グローバル
_ function fn(){ document.write(hs[0].name) } // クロージャー
_ fn(); // 即時関数内の定数を参照可能
})();
案3. メソッド関数から参照
var obj = {
_ hs: [ ... ],
_ fn: function(){ document.write(this.hs[0].name) }, // メソッド
};
obj.fn(); // オブジェクト内の定数を参照可能
案4. 束縛された関数から参照
var obj = { hs:[ ... ] };
function fx(){ document.write(this.hs[0].name) }
var fn = fx.bind(obj); // 特定オブジェクトに束縛された関数
fn(); // 束縛されたオブジェクト内の定数を参照可能
案1が最も単純で分かりやすいと思いました。
しかし独自の名前空間に全ての変数を定義する事で、既存の2次元変数が3次元変数に、3次元変数は4次元変数に、階層が1段ずつ深くなってしまうというのが、好きくないです。
また、配列hsと関数fn()を別々のファイルで定義したいため、案2~4は、使えないと思いました。
グローバル変数を使用する事により、被る深刻な損害はどのようなものが考えられますか。
No.1
- 回答日時:
こんにちは
対象がローカル変数の場合はできません。
グローバル変数にしておけば、参照可能になります。
https://developer.mozilla.org/ja/docs/Glossary/S …
https://developer.mozilla.org/ja/docs/Web/JavaSc …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
document.writeで画面が消える
-
引数を渡さずに呼び出し元の変...
-
同じIDで定義した要素の配列を...
-
関数でy=g(x)のgとは何の略です...
-
<a>タグのテキストを取得
-
【正規表現】【javascript】CR...
-
javascriptで文字挿入でtoggle...
-
句点“。”で区切り、“。”も含め...
-
Boolean型配列中のTrueの有無を...
-
gas スプレッドシートがアクテ...
-
スロットマシン風の表示
-
ローカルにあるファイルを検索...
-
Vb.netのグローバル変数の宣言...
-
毎週土曜日のみの日付を取得、...
-
ActiveXobjectが作成できない
-
javascript(jQuery)でセル内...
-
Click回数を数え、規定された回...
-
Null またはオブジェクトではあ...
-
「javascript」のプログラミン...
-
数字とプラス以外の入力をチェ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
window.openでタイトル名の指定
-
○歳△ヶ月と×日を計算してくれる...
-
JavaScriptとHTMLの課題です
-
ホームページに日付を自動更新...
-
なぜ、ジャバスクリプトが表示...
-
配列を使って平均を求めるプロ...
-
引数を渡さずに呼び出し元の変...
-
for文のiを使ってリンク先のア...
-
javascriptとphpの連携で疑問
-
document.write()の()内にタグ...
-
document.writeで画面が消える
-
JAVAで時刻に対して簡単な四則...
-
現在の日付から、1ヶ月前にす...
-
カレンダーをプログラミング
-
初歩的なことなんですけど
-
document.write内のタグ
-
今日の月と日付の1週間後や3日...
-
Javascriptのfunction文がわか...
-
来年の今日の曜日・・・?
-
Java Scriptのメソッドについて
おすすめ情報