No.1
- 回答日時:
こんにちは
対象がローカル変数の場合はできません。
グローバル変数にしておけば、参照可能になります。
https://developer.mozilla.org/ja/docs/Glossary/S …
https://developer.mozilla.org/ja/docs/Web/JavaSc …
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.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)と引数を渡せば、解決する事なのですよね^^
よって見事にこだわりを捨てる方向へ誘導していただきました^^
お探しの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ランキング
-
なぜ、ジャバスクリプトが表示...
-
htmlの中に記述している画像フ...
-
【JavaScript】実体参照符号化...
-
window.openでタイトル名の指定
-
ホームページに日付を自動更新...
-
iframe内に特定の文字列がある...
-
関数でy=g(x)のgとは何の略です...
-
C#テキストボックスの文字を配...
-
同じIDで定義した要素の配列を...
-
アクセス時からのカウントダウ...
-
二次元配列を使って順位をだす...
-
pdfに丸秘などのスタンプを...
-
bt_melter.jsをサイトの一部の...
-
javaScriptのコードの修正をお...
-
ASP+アクセスでのSQLコメントに...
-
JavaScript window.openで開く...
-
C#OpenCv V4にのエラーに関する...
-
gas スプレッドシートがアクテ...
-
MFCのキャプション変更
-
船のゲームを作っているのです...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
window.openでタイトル名の指定
-
ホームページに日付を自動更新...
-
○歳△ヶ月と×日を計算してくれる...
-
文字列を点滅させたい
-
なぜ、ジャバスクリプトが表示...
-
今日の月と日付の1週間後や3日...
-
JS、document.write出力位置設定
-
iframe内に特定の文字列がある...
-
自動ポップアップで画像を表示...
-
テキストボックスに入力された...
-
innerHTMLにて設定した情報を再...
-
document.open()の意味とは
-
ジャバスクリプトで空白(スペー...
-
Java Scriptのメソッドについて
-
document.clear()の使い方について
-
ウェブ上にキーボードを作りた...
-
document.writeで画面が消える
-
「分」単位で加算(減算)したい。
-
java カレンダーの日付指定で...
-
現在の日付から、1ヶ月前にす...
おすすめ情報