回答編集履歴

5

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

2017/09/23 15:14

投稿

think49
think49

スコア18164

test CHANGED
@@ -194,7 +194,7 @@
194
194
 
195
195
  module を使う事は質問されているコードを推奨せず、module を使ったコードを推奨する回答となります。
196
196
 
197
- これは前述の私のスタンスと矛盾する為、[別の記事で新しく回答しました](https://teratail.com/questions/93561#nbspmodulenbspecmascriptnbsp6nbsp)
197
+ これは前述の私のスタンスと矛盾する為、本スレッドの別の記事で新しく回答しました。
198
198
 
199
199
 
200
200
 

4

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

2017/09/23 15:14

投稿

think49
think49

スコア18164

test CHANGED
@@ -32,53 +32,177 @@
32
32
 
33
33
  詳しい使い方は下記スレッドの私の回答を読んでみて下さい。
34
34
 
35
+
36
+
35
- https://teratail.com/questions/87024
37
+ - [JavaScript - 変数に論理演算子を使用する意味を教えて下さい。(87024)|teratail](https://teratail.com/questions/87024)
36
-
37
-
38
-
38
+
39
+
40
+
39
- ### window
41
+ ### window キーワード
40
-
41
-
42
-
42
+
43
+
44
+
43
- window キーワードはブラウザは、グローバルオブジェクトを参照しますがNode.js など、実装によっては存在しせん
45
+ `window` キーワードでグローバルオブジェクトを参照できる機能はHTML Standard によって規定されてい
46
+
47
+
48
+
44
-
49
+ - [7.3 The Window object - HTML Standard 日本語訳](https://momdo.github.io/html/window-object.html#the-window-object)
50
+
51
+
52
+
53
+ しかし、全てのJavaScript実装が HTML Standard を実装しているわけではない為、JavaScript 実装によっては `window` キーワードによってグローバルオブジェクトを参照できません。
54
+
45
- 全てのJavaScript実装でグローバルオブジェクトを参照するには次のように書きます。
55
+ そこで、ECMAScript という基本仕様に則り、キーワードを使わずにグローバルオブジェクトを参照する事で、実装依存性を無くすことが出来ます。
56
+
57
+
58
+
59
+ ```HTML
60
+
61
+ <script>
62
+
63
+ /**
64
+
65
+ * このコードは ES6 の module ではないグローバルコードです
66
+
67
+ */
68
+
69
+
70
+
71
+ 'use strict'; // Strict Mode を指定します
72
+
73
+
74
+
75
+ /**
76
+
77
+ * (1) グローバルコード
78
+
79
+ */
80
+
81
+ var global = this; // グローバルコードにおける this はグローバルオブジェクトを参照します
82
+
83
+
84
+
85
+ /**
86
+
87
+ * (2) 関数コード1
88
+
89
+ */
90
+
91
+ (function () {
92
+
93
+ var global = this; // Function#call で束縛された為、グローバルコードと同じようにグローバルオブジェクトを参照出来ます
94
+
95
+ }.call(this)); // グローバルコードからグローバルオブジェクトを引き渡します
96
+
97
+
98
+
99
+ /**
100
+
101
+ * (3) 関数コード2
102
+
103
+ */
104
+
105
+ (function () {
106
+
107
+ var global = Function('return this')(); // Function() 内の関数コードはグローバルスコープで実行されます
108
+
109
+ }());
110
+
111
+ </script>
112
+
113
+ ```
114
+
115
+
116
+
117
+ ### Strict Mode
118
+
119
+
120
+
121
+ JavaScript には「Strict Mode」と「非Strict Mode」の二種類の実行形式が存在します。
122
+
123
+ Strict Mode を指定するには、コード中に `"use strict";` を記述します。
46
124
 
47
125
 
48
126
 
49
127
  ```JavaScript
50
128
 
129
+ <script> // module ではない
130
+
51
131
  'use strict';
52
132
 
53
- // (1)
54
-
55
- var global = this; // グローバルコードにおける this はグローバルオブジェクトを参照する
133
+ console.log(this); // Window (グローバルコードでは、this はグローバルオブジェクトを参照する)
56
-
57
-
58
-
59
- // (2)
134
+
60
-
135
+
136
+
61
- (function () {
137
+ (function () {
62
-
63
- var global = this; // グローバルコードと同じように参照出来る
138
+
64
-
65
- }.call(this)); // グローバルコードからグローバルオブジェクト引き渡
139
+ console.log(this); // undefined (関数コードでは undefined 参照る)
66
-
67
-
68
-
69
- // (3)
70
-
71
- (function () {
72
-
73
- var global = Function('return this')(); // Function() 内の関数コードはグローバルスコープで実行される
74
140
 
75
141
  }());
76
142
 
143
+ </script>
144
+
77
145
  ```
78
146
 
79
147
 
80
148
 
149
+ 非Strict Modeを指定するには、`"use strict";` を記述しません。
150
+
151
+
152
+
153
+ ```JavaScript
154
+
155
+ <script> // module ではない
156
+
157
+ 'use strict';
158
+
159
+ console.log(this); // Window (グローバルコードでは、this 値はグローバルオブジェクトを参照する)
160
+
161
+
162
+
163
+ (function () {
164
+
165
+ console.log(this); // Window (関数コードでもグローバルオブジェクトを参照する)
166
+
167
+ }());
168
+
169
+ </script>
170
+
171
+ ```
172
+
173
+
174
+
81
- `window` キーワードによるグローバルオブジェクト参照はブラウザでは保証されていますが、JavaScript実装全体と**実装依存**となります。
175
+ なお、JavaScript では `this` 値は関数が行されたタイミング決定されものであ、関数の呼び出し方によっては例外があります。
176
+
177
+
178
+
179
+ - `Function#call`, `Function#apply`, `Function#bind`
180
+
181
+ - アロー関数
182
+
183
+ - `addEventListener` の第二引数
184
+
185
+ - `Array#forEach` の第二引数
186
+
187
+
188
+
189
+ ### module (ECMAScript 6 規定)
190
+
191
+
192
+
193
+ ES6 の module を使った場合には、事情が大きく異なります。
194
+
195
+ module を使う事は質問されているコードを推奨せず、module を使ったコードを推奨する回答となります。
196
+
197
+ これは前述の私のスタンスと矛盾する為、[別の記事で新しく回答しました](https://teratail.com/questions/93561#nbspmodulenbspecmascriptnbsp6nbsp)。
198
+
199
+
200
+
201
+ ### 更新履歴
202
+
203
+
204
+
205
+ - 2017/09/23 23:50 「Strict Mode」「module (ECMAScript 6 規定)」節を追加。「window キーワード」節の文面変更。
82
206
 
83
207
 
84
208
 

3

truthy判定

2017/09/23 14:50

投稿

think49
think49

スコア18164

test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- こちらのコードは、このコードが実行されるタイミングで `window._mfq` の存在確認し、値を代入します。
13
+ こちらのコードは、このコードが実行されるタイミングで `window._mfq` のtruthy判定し、値を代入します。
14
14
 
15
15
 
16
16
 
@@ -22,7 +22,7 @@
22
22
 
23
23
 
24
24
 
25
- こちらのコードも、このコードが実行されるタイミングで `_mfq` の存在確認して値を代入しますが、`var` による変数の実体化処理が別途走ります。
25
+ こちらのコードも、このコードが実行されるタイミングで `_mfq` のtruthy判定して値を代入しますが、`var` による変数の実体化処理が別途走ります。
26
26
 
27
27
  `var` の初期化処理は特殊で前方に遡って、`undefined` で初期化するのです。
28
28
 

2

window

2017/09/23 04:53

投稿

think49
think49

スコア18164

test CHANGED
@@ -1,3 +1,7 @@
1
+ ### 変数宣言文
2
+
3
+
4
+
1
5
  > ```JavaScript
2
6
 
3
7
  > window._mfq = window._mfq || [];
@@ -32,4 +36,50 @@
32
36
 
33
37
 
34
38
 
39
+ ### window
40
+
41
+
42
+
43
+ window キーワードはブラウザでは、グローバルオブジェクトを参照しますが、Node.js など、実装によっては存在しません。
44
+
45
+ 全てのJavaScript実装でグローバルオブジェクトを参照するには次のように書きます。
46
+
47
+
48
+
49
+ ```JavaScript
50
+
51
+ 'use strict';
52
+
53
+ // (1)
54
+
55
+ var global = this; // グローバルコードにおける this はグローバルオブジェクトを参照する
56
+
57
+
58
+
59
+ // (2)
60
+
61
+ (function () {
62
+
63
+ var global = this; // グローバルコードと同じように参照出来る
64
+
65
+ }.call(this)); // グローバルコードからグローバルオブジェクトを引き渡す
66
+
67
+
68
+
69
+ // (3)
70
+
71
+ (function () {
72
+
73
+ var global = Function('return this')(); // Function() 内の関数コードはグローバルスコープで実行される
74
+
75
+ }());
76
+
77
+ ```
78
+
79
+
80
+
81
+ `window` キーワードによるグローバルオブジェクト参照はブラウザでは保証されていますが、JavaScript実装全体で見ると**実装依存**となります。
82
+
83
+
84
+
35
85
  Re: gomengo さん

1

typo

2017/09/23 04:52

投稿

think49
think49

スコア18164

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- らのコードは、このコードが実行されるタイミングで `window._mfq` の存在確認し、値を代入します。
9
+ らのコードは、このコードが実行されるタイミングで `window._mfq` の存在確認し、値を代入します。
10
10
 
11
11
 
12
12