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

回答編集履歴

3

式は単体では動作せず、文または宣言の一部としてしか使用できない

2020/06/07 03:32

投稿

think49
think49

スコア18194

answer CHANGED
@@ -92,7 +92,7 @@
92
92
  そして、重要な違いは
93
93
 
94
94
  - 宣言と文は単体で動作する
95
- - **式は単体では動作せず、文またはの一部としてしか使用できない**
95
+ - **式は単体では動作せず、文または宣言の一部としてしか使用できない**
96
96
 
97
97
  という性質にあり、jsprimmer上では、それを
98
98
 

2

[参考] function キーワードで始まらないコード

2020/06/07 03:32

投稿

think49
think49

スコア18194

answer CHANGED
@@ -157,4 +157,37 @@
157
157
  - `function` キーワードで始められるのは関数宣言のみ
158
158
  - 間数式を格納している文または宣言(※関数宣言を除く)は `function` キーワードで始める事は出来ない
159
159
 
160
+ ### [参考] function キーワードで始まらないコード
161
+
162
+ 「名前のない即時関数」を書く場合を想定すると、function キーワードの違いが分かります。
163
+ 下記コードはGoogle Chromeで実行した結果ですが、
164
+
165
+ ```JavaScript
166
+ function(){} // SyntaxError: Function statements require a function name
167
+ ```
168
+
169
+ functionキーワードで始められるのは関数宣言のみの為、JavaScriptエンジンはこのコードを関数宣言として扱おうとしますが、**名前がない関数宣言**が記述されている為、SyntaxError(文法エラー)を返しています。
170
+ (※前述の通り、関数宣言は文ではない為、エラーメッセージ内の `"Function statements"` は間違いです)
171
+
172
+ `()` で括って、**functionキーワードで始まらない記述にすれば**、エラーは発生しません。
173
+
174
+ ```JavaScript
175
+ (function(){}); // エラーにならない
176
+ ```
177
+
178
+ `();` を末尾につけて、実行すれば、よく見る即時関数の形式になります。
179
+
180
+ ```JavaScript
181
+ (function(){
182
+ console.log('Hello, World!');
183
+ })();
184
+
185
+ (function(){
186
+ console.log('Hello, JavaScript!');
187
+ }());
188
+ ```
189
+
190
+ - `function` キーワードで始まっていないので、このコードは「関数宣言(FunctionDeclaration)」ではありません
191
+ - `function` キーワードで始まっていないので、このコードは「式文(ExpressionStatement)」です
192
+
160
193
  Re: tanakashouzoux さん

1

宣言(※関数宣言を除く)

2020/06/06 11:28

投稿

think49
think49

スコア18194

answer CHANGED
@@ -155,6 +155,6 @@
155
155
  更に要約すると、次のようになります。
156
156
 
157
157
  - `function` キーワードで始められるのは関数宣言のみ
158
- - 間数式を格納している文または宣言は `function` キーワードで始める事は出来ない
158
+ - 間数式を格納している文または宣言(※関数宣言を除く)は `function` キーワードで始める事は出来ない
159
159
 
160
160
  Re: tanakashouzoux さん