回答編集履歴

2

Babelを紹介

2016/01/08 21:19

投稿

raccy
raccy

スコア21735

test CHANGED
@@ -120,4 +120,4 @@
120
120
 
121
121
 
122
122
 
123
- 単純に短く書きたいだけであれば、最初からCoffeeScriptで書いた方がいいです。
123
+ functionを単純に短く書けるようにした物ではないため、単に短く書きたいだけであれば、最初からCoffeeScriptで書いた方がいいです。アロー関数が本来のES5ではどう解釈されるかはBabel等を用いて変換してみるとわかるかと思います。[Babel: Try it out](https://babeljs.io/repl/)で色々試してみてください。

1

再帰の時の名前とか

2016/01/08 21:19

投稿

raccy
raccy

スコア21735

test CHANGED
@@ -2,11 +2,97 @@
2
2
 
3
3
 
4
4
 
5
- 関数宣言式の利点は**巻き上げ**ぐらいで、ほとんどありません。関数にある名前を使ってその関数に**アクセスしているわけではない**からです。
5
+ 関数宣言式の利点は**巻き上げ**ぐらいで、ほとんどありません。関数外部から関数にある名前を使ってその関数に**アクセスしているわけではない**からです。
6
6
 
7
7
  参考: [stackoverflow jp: function hoge() と hoge = function() の違いは?](http://ja.stackoverflow.com/questions/2781/function-hoge-%E3%81%A8-hoge-function-%E3%81%AE%E9%81%95%E3%81%84%E3%81%AF)
8
8
 
9
9
  また、関数宣言式にしても後からの破壊的代入を防げるわけではありません。名前の破壊を防ぎたいのであれば、`const`を使って定数にすべきでしょう。
10
+
11
+
12
+
13
+ 上とは別に、名前付き関数の利点として、関数内部でその関数名の関数スコープである暗黙の**ローカル変数**が作成され、それが**上書きされない**という利点があります。アロー関数で全く同じ方法をとることはできませんが、関数を返す関数を実行して、上書きされない関数スコープのロカール変数を使えばできます。下記の`fn1`を参考にしてみてください。
14
+
15
+
16
+
17
+ ```JavaScript
18
+
19
+ "use strict";
20
+
21
+ var fn0 = (i) => {
22
+
23
+ return i < 10 ? fn0(++i) : i;
24
+
25
+ };
26
+
27
+ var fn0x = fn0;
28
+
29
+ console.log(fn0x(0)); // 10
30
+
31
+ fn0 = (i) => {
32
+
33
+ return 0;
34
+
35
+ };
36
+
37
+ console.log(fn0x(0)); // 0 になっちゃう。あかんわ。
38
+
39
+
40
+
41
+ var fn1 = () => {
42
+
43
+ var _fn1 = (i) => {
44
+
45
+ return i < 10 ? _fn1(++i) : i;
46
+
47
+ };
48
+
49
+ return _fn1;
50
+
51
+ }();
52
+
53
+ var fn1x = fn1;
54
+
55
+ console.log(fn1x(0)); // 10
56
+
57
+ fn1 = (i) => {
58
+
59
+ return 0;
60
+
61
+ };
62
+
63
+ console.log(fn1x(0)); // 10 のまま!やったぜ!
64
+
65
+ ```
66
+
67
+
68
+
69
+ ただ、そもそも関数自体が上書きされること自体が想定外の動作を起こす可能性があるため、単に`const`をつけて上書き禁止にした方がES6っぽいかと思います。
70
+
71
+
72
+
73
+ ```JavaScript
74
+
75
+ "use strict";
76
+
77
+ const fn2 = (i) => {
78
+
79
+ return i < 10 ? fn2(++i) : i;
80
+
81
+ };
82
+
83
+ var fn2x = fn2;
84
+
85
+ console.log(fn2x(0)); // 10
86
+
87
+ fn2 = (i) => {
88
+
89
+ return 0;
90
+
91
+ }; // この時点でエラーになる!!
92
+
93
+ console.log(fn2x(0));
94
+
95
+ ```
10
96
 
11
97
 
12
98
 
@@ -22,7 +108,15 @@
22
108
 
23
109
 
24
110
 
25
- アロー関数は通常のfunctionの代わりになるものではありません。コード内に`this`がなければfunctionを使った無名関数と動作は同じですが、`this`があれば動作は異なります。定義している環境の`this`に強制的に束縛したい場合は、アロー演算子を使った方が簡単に書けると言うことです。そのようなことがなければ、無理に使わず、functionを使い続けたほうがいいでしょう。
111
+ アロー関数は通常のfunctionの単純なになるものではありません。
112
+
113
+
114
+
115
+ 再帰関数で関数名を用いたときに、その名前の上書きを防ぎたいのであれば、関数を返す関数を実行して、スコープ内に閉じ込めるか、`const`で上書きそのものを防げばいいかと思います。
116
+
117
+
118
+
119
+ `this`の束縛ですが、コード内に`this`がなければfunctionを使った無名関数と動作は同じですが、`this`があれば**必ず**動作は異なります。こちらについては**回避方法はありません。**定義している環境の`this`に強制的に束縛したい場合は、アロー演算子を使った方が簡単に書けると言うだけです。呼び出し方によって`this`の束縛が変わるような関数を作成したい場合は、**functionを使う以外方法はありません**。
26
120
 
27
121
 
28
122