例3だけ意図した動きにならないことがあります
詳細が分からないのでヤマカンですが、
例3は同じスコープから持って来てるのでアレですが、
別の場所に束縛した関数とかだと変な動きすることがありますね。
仮引数として束縛してはいかが?
JavaScriptは関数は第一級オブジェクトなので、関数の引数に設定したり、戻り値として返す事が出来ます。
JavaScript
1var fn = function (num) {
2 return function () {
3 return num * 2;
4 }
5}
6var toSix = fn(3);
7console.log(toSix());
8// 6
9
10console.log(toSix(10));
11// 6 <- 帰ってきた関数はnum=3と束縛済みなので引数を変えても無駄
12
13console.log(fn(2)());
14// 4 <- 普通に使おうとした時はキモくなる、何とかならんか?
15
16console.log(toSix);
17// ƒ () { return num * 2; }
関数を返す関数は仕組みが分かってる時は便利ですが、
パッと見せられたり普通に使う場面では相当キモいですね。
なんとかならんか?こういう目的の為に
JavaScript
1// 今回は普通に値を返す関数だ
2var fn = function (num) {
3 return num * 2;
4}
5var toSix = fn.bind(null, 3);
6console.log(toSix());
7// 6
8
9console.log(toSix(10));
10// 6 <- 帰ってきた関数はnum=3と束縛済みなので引数を変えても無駄
11
12console.log(fn(2));
13// 4 <- 普通の関数として宣言したので普通に使う事も可能
恐らく例3で困るのはthisだと思うので、thisを束縛してあげましょう。
これを利用するとこんな感じの解決になります。
JavaScript
1var fn = function (self) {
2 // thisではなく、selfを利用する
3}
4setTimeout(fn.bind(null, this), 200);
まぁ、bindの第一引数はthisそのものの束縛なので、こう書いても多分意図通りになるかと思います。
JavaScript
1var fn = function () {
2 // thisを使った処理
3}
4setTimeout(fn.bind(this), 200);