teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

5

同じ見出しが複数存在しても「フラグメント識別子」\(id="nbspmodulenbspecmascriptnbsp6nbsp"\)が変化せず、目的の記事に遷移できない為、リンク削除

2017/09/23 15:14

投稿

think49
think49

スコア18194

answer CHANGED
@@ -96,7 +96,7 @@
96
96
 
97
97
  ES6 の module を使った場合には、事情が大きく異なります。
98
98
  module を使う事は質問されているコードを推奨せず、module を使ったコードを推奨する回答となります。
99
- これは前述の私のスタンスと矛盾する為、[別の記事で新しく回答しました](https://teratail.com/questions/93561#nbspmodulenbspecmascriptnbsp6nbsp)
99
+ これは前述の私のスタンスと矛盾する為、本スレッドの別の記事で新しく回答しました。
100
100
 
101
101
  ### 更新履歴
102
102
 

4

「Strict Mode」「module \(ECMAScript 6 規定\)」節を追加。「window キーワード」節の文面変更。

2017/09/23 15:14

投稿

think49
think49

スコア18194

answer CHANGED
@@ -15,29 +15,91 @@
15
15
  `var` が記述された場所がグローバルコードならグローバルコードの先頭で変数を `undefined` で初期化し、関数コードなら関数の先頭で変数を`undefined` で初期化します。
16
16
 
17
17
  詳しい使い方は下記スレッドの私の回答を読んでみて下さい。
18
- https://teratail.com/questions/87024
19
18
 
20
- ### window
19
+ - [JavaScript - 変数に論理演算子を使用する意味を教えて下さい。(87024)|teratail](https://teratail.com/questions/87024)
21
20
 
22
- window キーワードはブラウザでは、グローバルオブジェクトを参照しますが、Node.js など、実装によっては存在しません。
21
+ ### window キーワード
23
- 全てのJavaScript実装でグローバルオブジェクトを参照するには次のように書きます。
24
22
 
23
+ `window` キーワードでグローバルオブジェクトを参照できる機能は、HTML Standard によって規定されています。
24
+
25
+ - [7.3 The Window object - HTML Standard 日本語訳](https://momdo.github.io/html/window-object.html#the-window-object)
26
+
27
+ しかし、全てのJavaScript実装が HTML Standard を実装しているわけではない為、JavaScript 実装によっては `window` キーワードによってグローバルオブジェクトを参照できません。
28
+ そこで、ECMAScript という基本仕様に則り、キーワードを使わずにグローバルオブジェクトを参照する事で、実装依存性を無くすことが出来ます。
29
+
30
+ ```HTML
31
+ <script>
32
+ /**
33
+ * このコードは ES6 の module ではないグローバルコードです
34
+ */
35
+
36
+ 'use strict'; // Strict Mode を指定します
37
+
38
+ /**
39
+ * (1) グローバルコード
40
+ */
41
+ var global = this; // グローバルコードにおける this はグローバルオブジェクトを参照します
42
+
43
+ /**
44
+ * (2) 関数コード1
45
+ */
46
+ (function () {
47
+ var global = this; // Function#call で束縛された為、グローバルコードと同じようにグローバルオブジェクトを参照出来ます
48
+ }.call(this)); // グローバルコードからグローバルオブジェクトを引き渡します
49
+
50
+ /**
51
+ * (3) 関数コード2
52
+ */
53
+ (function () {
54
+ var global = Function('return this')(); // Function() 内の関数コードはグローバルスコープで実行されます
55
+ }());
56
+ </script>
57
+ ```
58
+
59
+ ### Strict Mode
60
+
61
+ JavaScript には「Strict Mode」と「非Strict Mode」の二種類の実行形式が存在します。
62
+ Strict Mode を指定するには、コード中に `"use strict";` を記述します。
63
+
25
64
  ```JavaScript
65
+ <script> // module ではない
26
66
  'use strict';
27
- // (1)
28
- var global = this; // グローバルコードにおける this はグローバルオブジェクトを参照する
67
+ console.log(this); // Window (グローバルコードでは、this はグローバルオブジェクトを参照する)
29
68
 
30
- // (2)
31
69
  (function () {
32
- var global = this; // グローバルコードと同じように参照出来る
33
- }.call(this)); // グローバルコードからグローバルオブジェクト引き渡
70
+ console.log(this); // undefined (関数コードでは undefined 参照る)
71
+ }());
72
+ </script>
73
+ ```
34
74
 
75
+ 非Strict Modeを指定するには、`"use strict";` を記述しません。
76
+
77
+ ```JavaScript
78
+ <script> // module ではない
35
- // (3)
79
+ 'use strict';
80
+ console.log(this); // Window (グローバルコードでは、this 値はグローバルオブジェクトを参照する)
81
+
36
82
  (function () {
37
- var global = Function('return this')(); // Function() 内の関数コードグローバルスコープで実行され
83
+ console.log(this); // Window (関数コードでもグローバルオブジェクトを参照す)
38
84
  }());
85
+ </script>
39
86
  ```
40
87
 
41
- `window` キーワードによるグローバルオブジェクト参照ブラウザは保証されています、JavaScript実装全体で見ると**実装依存**となります。
88
+ なお、JavaScript では `this` 関数が実行されたタイミング決定されるものであり、関数の呼び出し方によっは例外ります。
42
89
 
90
+ - `Function#call`, `Function#apply`, `Function#bind`
91
+ - アロー関数
92
+ - `addEventListener` の第二引数
93
+ - `Array#forEach` の第二引数
94
+
95
+ ### module (ECMAScript 6 規定)
96
+
97
+ ES6 の module を使った場合には、事情が大きく異なります。
98
+ module を使う事は質問されているコードを推奨せず、module を使ったコードを推奨する回答となります。
99
+ これは前述の私のスタンスと矛盾する為、[別の記事で新しく回答しました](https://teratail.com/questions/93561#nbspmodulenbspecmascriptnbsp6nbsp)。
100
+
101
+ ### 更新履歴
102
+
103
+ - 2017/09/23 23:50 「Strict Mode」「module (ECMAScript 6 規定)」節を追加。「window キーワード」節の文面変更。
104
+
43
105
  Re: gomengo さん

3

truthy判定

2017/09/23 14:50

投稿

think49
think49

スコア18194

answer CHANGED
@@ -4,13 +4,13 @@
4
4
  > window._mfq = window._mfq || [];
5
5
  > ```
6
6
 
7
- こちらのコードは、このコードが実行されるタイミングで `window._mfq` の存在確認し、値を代入します。
7
+ こちらのコードは、このコードが実行されるタイミングで `window._mfq` のtruthy判定し、値を代入します。
8
8
 
9
9
  > ```JavaScript
10
10
  > var _mfq = _mfq || [];
11
11
  > ```
12
12
 
13
- こちらのコードも、このコードが実行されるタイミングで `_mfq` の存在確認して値を代入しますが、`var` による変数の実体化処理が別途走ります。
13
+ こちらのコードも、このコードが実行されるタイミングで `_mfq` のtruthy判定して値を代入しますが、`var` による変数の実体化処理が別途走ります。
14
14
  `var` の初期化処理は特殊で前方に遡って、`undefined` で初期化するのです。
15
15
  `var` が記述された場所がグローバルコードならグローバルコードの先頭で変数を `undefined` で初期化し、関数コードなら関数の先頭で変数を`undefined` で初期化します。
16
16
 

2

window

2017/09/23 04:53

投稿

think49
think49

スコア18194

answer CHANGED
@@ -1,3 +1,5 @@
1
+ ### 変数宣言文
2
+
1
3
  > ```JavaScript
2
4
  > window._mfq = window._mfq || [];
3
5
  > ```
@@ -15,4 +17,27 @@
15
17
  詳しい使い方は下記スレッドの私の回答を読んでみて下さい。
16
18
  https://teratail.com/questions/87024
17
19
 
20
+ ### window
21
+
22
+ window キーワードはブラウザでは、グローバルオブジェクトを参照しますが、Node.js など、実装によっては存在しません。
23
+ 全てのJavaScript実装でグローバルオブジェクトを参照するには次のように書きます。
24
+
25
+ ```JavaScript
26
+ 'use strict';
27
+ // (1)
28
+ var global = this; // グローバルコードにおける this はグローバルオブジェクトを参照する
29
+
30
+ // (2)
31
+ (function () {
32
+ var global = this; // グローバルコードと同じように参照出来る
33
+ }.call(this)); // グローバルコードからグローバルオブジェクトを引き渡す
34
+
35
+ // (3)
36
+ (function () {
37
+ var global = Function('return this')(); // Function() 内の関数コードはグローバルスコープで実行される
38
+ }());
39
+ ```
40
+
41
+ `window` キーワードによるグローバルオブジェクト参照はブラウザでは保証されていますが、JavaScript実装全体で見ると**実装依存**となります。
42
+
18
43
  Re: gomengo さん

1

typo

2017/09/23 04:52

投稿

think49
think49

スコア18194

answer CHANGED
@@ -2,7 +2,7 @@
2
2
  > window._mfq = window._mfq || [];
3
3
  > ```
4
4
 
5
- らのコードは、このコードが実行されるタイミングで `window._mfq` の存在確認し、値を代入します。
5
+ らのコードは、このコードが実行されるタイミングで `window._mfq` の存在確認し、値を代入します。
6
6
 
7
7
  > ```JavaScript
8
8
  > var _mfq = _mfq || [];