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で質問しましょう!
似たような質問が見つかりました
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript javascriptで変数を組み込みたい 2 2023/01/13 09:52
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- JavaScript 電車の運賃を出すプログラムを作っています。 2 2022/06/22 09:36
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
window.openでタイトル名の指定
-
○歳△ヶ月と×日を計算してくれる...
-
javaで画像をランダム表示しつ...
-
同じIDで定義した要素の配列を...
-
<a>タグのテキストを取得
-
C#OpenCv V4にのエラーに関する...
-
GASでundefinedエラーが出ます
-
C#テキストボックスの文字を配...
-
ActiveXobjectが作成できない
-
functionから別のfunctionを実...
-
クリッカブルマップのリンク部...
-
JAVAスクリプトで指定時間以降...
-
undefinedを表示させない方法は...
-
Vb.netのグローバル変数の宣言...
-
googleスプレッドシートのApps ...
-
シンプルなweb版スタンプラリー...
-
DOM要素を削除しても、イベント...
-
FireFoxのjavascriptで自動でキ...
-
【正規表現】【javascript】CR...
-
テーブルセル内のinput要素のna...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
window.openでタイトル名の指定
-
○歳△ヶ月と×日を計算してくれる...
-
時間帯によって背景画像を変える
-
なぜ、ジャバスクリプトが表示...
-
document.open()の意味とは
-
前のページに戻るとページトッ...
-
for文のiを使ってリンク先のア...
-
HpのFlashで,ブロック回避の方...
-
JavaScriptで乱数+乱数の計算結...
-
カウントダウン JavaScript の ...
-
来年の今日の曜日・・・?
-
「分」単位で加算(減算)したい。
-
javascriptをはじめて勉強して...
-
javascriptとphpの連携で疑問
-
ウェブ上にキーボードを作りた...
-
初歩的なことなんですけど
-
コンマとクオーテーションマー...
-
JavaScriptでFirefox使用者の閲...
-
innerHTMLにて設定した情報を再...
-
document.openの意味
おすすめ情報