プロが教える店舗&オフィスのセキュリティ対策術

引数を渡さずに呼び出し元の変数等を参照できますか。

例えば次のように、呼び出し元で定数を定義して、
const hs = [{name: 'ディープ', no: 1}, {name: 'オルフェ', no: 2}]

.jsファイルで次のようにhsを使いたいです。
function fn() {document.write(hs[0].name)}

A 回答 (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 …
    • good
    • 0
この回答へのお礼

かなり簡単にやばい状況に陥ってしまう事が分かりました。
案1改、案5と安全策を考えていただきましたが、そもそも私の些細なこだわりを捨てて、fn(hs)と引数を渡せば、解決する事なのですよね^^
よって見事にこだわりを捨てる方向へ誘導していただきました^^

お礼日時:2020/11/01 15:37

安易にグローバル変数を多用するのは危険ですので、


少々面倒となりますが以下の方式でいかがでしょうか。

案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(); // 束縛されたオブジェクト内の定数を参照可能
    • good
    • 0
この回答へのお礼

案1が最も単純で分かりやすいと思いました。
しかし独自の名前空間に全ての変数を定義する事で、既存の2次元変数が3次元変数に、3次元変数は4次元変数に、階層が1段ずつ深くなってしまうというのが、好きくないです。

また、配列hsと関数fn()を別々のファイルで定義したいため、案2~4は、使えないと思いました。

グローバル変数を使用する事により、被る深刻な損害はどのようなものが考えられますか。

お礼日時:2020/10/30 22:13

こんにちは



対象がローカル変数の場合はできません。
グローバル変数にしておけば、参照可能になります。
https://developer.mozilla.org/ja/docs/Glossary/S …
https://developer.mozilla.org/ja/docs/Web/JavaSc …
    • good
    • 0
この回答へのお礼

window.hsでできました^^

お礼日時:2020/10/30 16:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!