回答編集履歴

1

5と6を追記しました。

2017/08/09 10:12

投稿

raccy
raccy

スコア21735

test CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
 
4
4
 
5
+ **【注意】**
6
+
7
+ `var`がない`a = a || {}`や`window.a = window.a || {}`という書き方や、`||`の左辺が`a`ではない`var a = window.a || {}`という書き方を否定する訳ではありません。
8
+
9
+
10
+
11
+ この文章はES5以上を想定しており、ES3は一切考慮していません。ES3についてはthink49さんの回答を参考にしてください。
12
+
13
+
14
+
5
15
  ###varの巻き上げ
6
16
 
7
17
 
@@ -60,6 +70,10 @@
60
70
 
61
71
  4. グローバル変数として定義している。
62
72
 
73
+ 5. 他ファイルでグローバル変数として定義している。
74
+
75
+ 6. 最初からグローバル変数として定義されている。
76
+
63
77
 
64
78
 
65
79
  それぞれ見ていきます。
@@ -334,8 +348,76 @@
334
348
 
335
349
 
336
350
 
351
+ ####5. 他ファイルでグローバル変数として定義している。
352
+
353
+
354
+
355
+ scriptタグで単純に二つのJavaScriptファイルを読み込んだ場合は、グローバル変数が衝突する場合があります。その場合に、既にグローバル変数が定義されていれば、それをそのまま使うというのは有効のように見えます。
356
+
357
+
358
+
359
+ ```JavaScript
360
+
361
+ var a = 1;
362
+
363
+ ```
364
+
365
+
366
+
367
+ ```JavaScript
368
+
369
+ var a = a || {};
370
+
371
+ // ...
372
+
373
+ ```
374
+
375
+
376
+
377
+ しかし、このようにして衝突を回避するという考え方自体が間違っています。そもそも、グローバル変数が衝突しないように即時関数やモジュールベースの書き方を採用すべきです。
378
+
379
+
380
+
381
+ ```JavaScript
382
+
383
+ (function() {
384
+
385
+ var a = a || {};
386
+
387
+ // ...
388
+
389
+ })();
390
+
391
+ ```
392
+
393
+
394
+
395
+ 即時関数の中に書いてしまえば、意味が無いことは既に述べたとおりです。
396
+
397
+
398
+
399
+ 全体を即時関数にした場合、ライブラリなのでグローバル変数が定義できないとか思うかもしれませんが、グローバル変数はグローバルオブジェクトのプロパティに過ぎませんので、グローバル変数のプロパティとして定義すれば良いだけです。そのとき、`var`の出番はありませんので、該当のコードが現れる事はありません。
400
+
401
+
402
+
403
+
404
+
405
+ ####6. 最初からグローバル変数として定義されている。
406
+
407
+
408
+
409
+ Polyfillに使う場合、既にグローバル変数があればオブジェクトを再設定する必要はありませんので、ある意味それは正しいように思えます。
410
+
411
+
412
+
413
+ しかし、それは完全なPolyfillとはいえません。理由はthink49さんの回答を見てください。また、グローバル変数名衝突回避のためにコード全体を即時関数で囲っているのであれば、`var`の所では必ず再設定になるため、意味がありません。グローバル変数を見たかったら、`var a = window.a || {}`と書く必要があるでしょう。
414
+
415
+
416
+
337
417
  ###まとめ
338
418
 
339
419
 
340
420
 
341
- よって、私の結論は最初の文に戻ります。`var a = a || {};`というコードは、そもそもコードとして不適切な場所にあるか、無意味な物です。そのため、極めて奇妙なコードに思えます。そのようなコードは良くないサンプルであると判断し、私としては、そのような事が書いてあるサイトや本自体を信頼しません。
421
+ よって、私の結論は最初の文に戻ります。`var a = a || {};`というコードは、そもそもコードとしてどこかが不適切ある(非推奨な方法を取っている)か、無意味な物です。そのため、極めて奇妙なコードに思えます。そのようなコードは良くないサンプルであると判断し、私としては、そのような事が書いてあるサイトや本自体を信頼しません。
422
+
423
+