回答編集履歴

5

もうちっと正確に?

2017/01/13 09:36

投稿

raccy
raccy

スコア21735

test CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
 
24
24
 
25
- なお、引数をなくす意味ですが、`id`という引数は変数`count`と同じくクロージャーによって内部関数である`countDownStart()`で**使用できます**。わざわざ引数として渡す必要はありません。もし、どうしても引数を付けたい場合は`countDownStart.bind(this, id)`(`this`の部分は今回使用していないので何でもいいです)と[`bind()`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)を用いて引数が束縛された新たな関数を作る必要があります。
25
+ なお、引数をなくす意味ですが、`id`という引数は変数`count`と同じくクロージャーによって内部関数である`countDownStart()`で**使用できます**。わざわざ引数として渡す必要はありません。もし、どうしても引数を付けたい場合は`countDownStart.bind(this, id)`(`this`の部分は今回使用していないので何でもいいです)と[`bind()`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)を用いて引数が束縛された新たな関数を作ったり、無名関数で囲って新たな関数にす等の対応が必要になります。
26
26
 
27
27
 
28
28
 

4

セミコロン

2017/01/13 09:36

投稿

raccy
raccy

スコア21735

test CHANGED
@@ -34,6 +34,6 @@
34
34
 
35
35
 
36
36
 
37
- 1. 実行されるscriptタグは最後(bodyの終了タグ直前)に書くことを推奨します。最後に書くと、jQueryでの`$(funciton{...})`と実質同じ効果が得られます。今回は`setInterval()`によって1000ミリ秒後にしかspanの部分を見に行かないためうまくいきますが、今回のような書き方だと、script内が最初に実行されるときに、spanの部分を**まだブラウザが認識していない**ということに注意してください。
37
+ 1. 実行されるscriptタグは最後(bodyの終了タグ直前)に書くことを推奨します。最後に書くと、jQueryでの`$(funciton{...});`と実質同じ効果が得られます。今回は`setInterval()`によって1000ミリ秒後にしかspanの部分を見に行かないためうまくいきますが、今回のような書き方だと、script内が最初に実行されるときに、spanの部分を**まだブラウザが認識していない**ということに注意してください。
38
38
 
39
39
  2. function宣言の**巻き上げ**により関数定義が後ろの方にあっても動作しますが、巻き上げの影響を十分理解していなければ、そのような書き方は推奨できません。関数は呼び出される場所よりも前に書くことを推奨します。

3

仮引数を無くすの意味

2017/01/12 21:52

投稿

raccy
raccy

スコア21735

test CHANGED
@@ -1,4 +1,4 @@
1
- 動作しない理由は、setIntervalの第一引数で、**関数そのもの**を渡しているのでは無く**関数を実行した結果**を渡しているからです。`countDownStart()`関数から仮引数を無くし、`setInterval(countDownStart,1000);`と書けば、動作すると思います。
1
+ 動作しない理由は、setIntervalの第一引数で、**関数そのもの**を渡しているのでは無く**関数を実行した結果**を渡しているからです。`countDownStart()`関数の定義から仮引数を無くし(つまり、`funciton countDownStart() {...}`と書くと言うこと)、`setInterval(countDownStart,1000);`と書けば、動作すると思います。
2
2
 
3
3
 
4
4
 

2

誤字の修正ともうちょっとわかりやすく?

2017/01/12 21:50

投稿

raccy
raccy

スコア21735

test CHANGED
@@ -14,11 +14,11 @@
14
14
 
15
15
 
16
16
 
17
- もうちょっと詳しく言います。`setInterval(countDownStart(id),1000);`を評価するとき、まず、それぞれの引数を評価します。引数は、`countDownStart(id)`と`1000`です。`countDownStart(id)`の評価では、idを引数に`countDownStart()`を**実行(呼び出)**して、その戻り値であるundefined値に置き換わります。`1000`は数値リテラルですのでその評価結果も1000を表す数値です。よって、引数の評価により、`setInterval(undefined値,1000という数値);`となってから、`setInterval()`が評価されます。第一引数の値はundefined値ですので、1000ミリ秒経っても何もされません。
17
+ もうちょっと詳しく言います。`setInterval(countDownStart(id),1000);`を評価するとき、まず、それぞれの引数を評価します。引数は、`countDownStart(id)`と`1000`です。`countDownStart(id)`の評価では、idを引数に`countDownStart()`を**実行(呼び出)**して、その戻り値であるundefined値に置き換わります。`1000`は数値リテラルですのでその評価結果も1000を表す数値です。よって、引数の評価により、`setInterval(undefined値,1000という数値);`となってから、`setInterval()`が評価されます。第一引数の値はundefined値ですので、1000ミリ秒経っても何もされません。
18
18
 
19
19
 
20
20
 
21
- では、`setInterval(countDownStart,1000);`と書いた場合はどうなるかというと、`countDownStart`は関数そのものを指し示す変数ですので、その評価の結果も関数そのものです。つまり、引数の評価後も`setInterval(countDownStartという関数,1000とう数値);`となります。ですので、1000ミリ秒経つと、第一引数の関数そのものが実行(呼び出)されます。
21
+ では、`setInterval(countDownStart,1000);`と書いた場合はどうなるかというと、`countDownStart`は関数そのものを指し示す変数ですので、その評価の結果も関数そのものです。つまり、引数の評価後も`setInterval(countDownStartという関数,1000とう数値);`となります。ですので、1000ミリ秒経つと、第一引数の関数そのものが実行(呼び出)されます。
22
22
 
23
23
 
24
24
 

1

理由と、補足

2017/01/12 21:49

投稿

raccy
raccy

スコア21735

test CHANGED
@@ -1,4 +1,4 @@
1
- setIntervalの第一引数で、**関数そのもの**を渡しているのでは無く**関数を実行した結果**を渡しているからです。`countDownStart()`関数から仮引数を無くし、`setInterval(countDownStart,1000);`と書けば、動作すると思います。
1
+ 動作しない理由は、setIntervalの第一引数で、**関数そのもの**を渡しているのでは無く**関数を実行した結果**を渡しているからです。`countDownStart()`関数から仮引数を無くし、`setInterval(countDownStart,1000);`と書けば、動作すると思います。
2
2
 
3
3
 
4
4
 
@@ -23,3 +23,17 @@
23
23
 
24
24
 
25
25
  なお、引数をなくす意味ですが、`id`という引数は変数`count`と同じくクロージャーによって内部関数である`countDownStart()`で**使用できます**。わざわざ引数として渡す必要はありません。もし、どうしても引数を付けたい場合は`countDownStart.bind(this, id)`(`this`の部分は今回使用していないので何でもいいです)と[`bind()`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)を用いて引数が束縛された新たな関数を作る必要があります。
26
+
27
+
28
+
29
+ 【補足】
30
+
31
+
32
+
33
+ その他の注意事項を書いておきます。
34
+
35
+
36
+
37
+ 1. 実行されるscriptタグは最後(bodyの終了タグ直前)に書くことを推奨します。最後に書くと、jQueryでの`$(funciton{...})`と実質同じ効果が得られます。今回は`setInterval()`によって1000ミリ秒後にしかspanの部分を見に行かないためうまくいきますが、今回のような書き方だと、script内が最初に実行されるときに、spanの部分を**まだブラウザが認識していない**ということに注意してください。
38
+
39
+ 2. function宣言の**巻き上げ**により関数定義が後ろの方にあっても動作しますが、巻き上げの影響を十分理解していなければ、そのような書き方は推奨できません。関数は呼び出される場所よりも前に書くことを推奨します。