質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

227閲覧

グローバルを汚染せず、WEBサイト訪問時に速やかにデータを取得し JavaScript で加工する方法

kerokeroflog

総合スコア4

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2024/11/11 08:29

編集2024/11/11 08:35

WEBサイト訪問時にサーバーでいくつかデータを取得し、その JSON をブラウザに渡し JavaScript で加工し HTML として表示する。

以上のような流れにおいて、JSON はどうやってブラウザに渡せばいいのでしょうか?

例えば php に次のように書いても、この data という変数はグローバルを汚染しますよね?

php

1<head> 2ㅤㅤ<script> 3ㅤㅤㅤㅤconst data= <?= json_encode(User::getData()); ?>; 4ㅤㅤ</script> 5</head>

もしかして、次のように即時関数を利用してスコープに閉じ込めればいいのでしょうか?(しかし <head> 内にやたら長いコードが入ってしまい HTML としてどうなのでしょうか?)

php

1<head> 2ㅤㅤ<script> 3ㅤㅤㅤㅤ(function() { 4ㅤㅤㅤㅤㅤㅤconst data = <?= json_encode(User::getData()); ?>; 5ㅤㅤㅤㅤㅤㅤ// dataを使ってHTMLに反映する処理をここに書く 6ㅤㅤㅤㅤ})(); 7ㅤㅤ</script> 8</head>

それとも、php から渡すのはやめて、JavaScript ですぐに .fetch() して data を取ってくればいいのでしょうか?(しかしこれではワンテンポ遅くなりますよね?)

極論を言えば好きにすればいいのかもしれませんが、とにかく実装経験がゼロなので、ご経験から思いついたアドバイスを頂ければと思って質問させていただきました。

ちなみに、JavaScript ファイルは全てモジュールを使っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kerokeroflog

2024/11/11 09:04

うおお、そういうことですか。なるほど、ありがとうございます! module は ".jsファイルごとの範囲でスコープを限定しれくれる" のかと思っていました。 そうではなくて、" <script type="module"> から </script> までの範囲でスコープを限定してくれる" という理解であっていますでしょうか?
juner

2024/11/11 09:14

両方です。(厳密には import / export できる空間内を他と隔離するです。
Lhankor_Mhy

2024/11/11 09:16 編集

PHP で js を書きだして、必要なモジュールで import すれば、headが大きくなる問題は解消できそうな気がします。 --- あ、すでにご解決だったのですね。失礼しました。
kerokeroflog

2024/11/11 09:31

juner様、なるほど、ありがとうございます。そういえば同じ .js ファイルに export を2回書くとVSCodeがエラーを出してくれますね。
kerokeroflog

2024/11/11 09:37

Lhankor_Mhy様、コメントありがとうございます。PHP で js を書きだすとはこれまた初耳な方法でした。調べてみます。
guest

回答2

0

ベストアンサー

script に type=module の指定を行うことは確認されましたでしょうか?

JavaScript モジュール - JavaScript | MDN

試しに下記の様なコードを書いてみます。

html

1<script type="module"> 2 // 変数の宣言 3 const data1 = {}; 4 // グローバルへの書き込み 5 globalThis.data3 = {}; 6</script> 7<script> 8 // 変数の宣言 9 const data2 = {}; 10 // グローバルへの書き込み 11 globalThis.data4 = {}; 12</script> 13<script> 14 alert("module script(data1) x normal script:",typeof data1); 15 alert("normal script(data2) x normal script:",typeof data2); 16 alert("module script(data3) x normal script:",typeof data3); 17 alert("normal script(data4) x normal script:",typeof data4); 18</script> 19<script type="module"> 20 alert("module script(data1) x module script:",typeof data1); 21 alert("normal script(data2) x module script:",typeof data2); 22 alert("module script(data3) x module script:",typeof data3); 23 alert("normal script(data4) x module script:",typeof data4); 24</script>

結果は次の様になりました。

output

1module script(data1) x normal script: undefined 2normal script(data2) x normal script: object 3module script(data3) x normal script: undefined 4normal script(data4) x normal script: object 5module script(data1) x module script: undefined 6normal script(data2) x module script: object 7module script(data3) x module script: object 8normal script(data4) x module script: object
書き込み \ 読む側normalmodule
normal (変数)見える見える
normal (グローバル)見える見える
module (変数)見えない見えない
module (グローバル)見える見える

まとめ

つまり type="module" を指定して top level で 変数を宣言するだけなら全くグローバル変数は汚染しない。
以上。

参考

投稿2024/11/11 09:02

編集2024/11/12 01:04
juner

総合スコア437

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kerokeroflog

2024/11/11 09:29

なんとまぁ分かりやすく丁寧なご回答を誠にありがとうございます。 なるほど、type="module" の方は data3 が object になっている一方で、type="module" ではない方の data3 には影響なし。ということですね。納得しました。 しかもサクッと書いてくださったテストコードがもう大変勉強になります。globalThis なんて全く見たことありませんし、値を代入するよりも typeof で型を見る方がミニマムですね。
juner

2024/11/11 10:29

typeof は 存在しなくてもエラーにならないので便利なんですよね
guest

0

結果として変数にうけるのであればconstで指定してもなにか別の処理をかましても同じです
グローバルなvar設定とかしなければ問題ないでしょう。

もちろんapiを用意してfetchでウケてもウケたデータは変数にうけますよね?
jsonpや無名変数で受ける手はありますが、結局は変数でうけているならその変数はなくなるわけではありません

html

1<?PHP 2$data=[1,"a",3]; 3var_dump(json_encode($data)); 4?> 5<script> 6(arg=>{ 7 console.log(arg); 8})(<?=json_encode($data)?>); 9</script>

これだってargが残っているといえば残ってますよね?

投稿2024/11/11 08:46

yambejp

総合スコア116443

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kerokeroflog

2024/11/11 09:11

ありがとうございます。根本的な理解が欠けていて「残っている」の感覚がなかなか掴めておりませんが、そうですよね。あとから data = null; など代入したところで、どうやったって「残っている」ですよね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問