js
1function hogehoge (data) {
2 console.log(data, category)
3}
綺麗なJSを作るコツとして、
記述していないものには頼らない事が重要です。
この例ですとcategory
ってなんやねんって話ですよ。
つまり、このcategoryには外から持ち込むという事を記述してやる必要があります。
使うものは全て持ち込みましょう。
候補は以下の2つです。
js
1// 2段階実行
2function hogehoge (category) {
3 return function (data) {
4 console.log(data, category);
5 }
6}
7
8// bindを使う作戦・ラッピング作戦
9function hogehoge (category, data) {
10 console.log(data, category);
11}
2段階実行のやり方から見ていきましょうか。
js
1function hogehoge (category) {
2 return function (data) {
3 console.log(data, category);
4 }
5}
6
7for (key in object) {
8 var category = object[key];
9 var url = '/json/data.json'
10 $.ajax({
11 url: url,
12 dataType: 'json'
13 })
14 .done(hogehoge(category));
15}
これだけで上手く動くはずです。
hogehoge
関数はcategory引数を待ち受ける関数です。
これにcategoryを突っ込んで実行すると?
本命ロジックの関数が払い出されます。
次はdata引数を待ち受けてconsole.log
を実行する関数です。
この時、実行するのに使ったcategory引数はバインドしっぱなしなのでちゃんとあるものとして使えるのです。
まぁ、hogehoge関数が汚れるのがダサいですね。
次いきましょ。
続いてbindを使うやり方
JavaScriptはオブジェクト指向言語なので関数もオブジェクトです。
その証拠として様々なプロパティやメソッドを所持しています。
その中で今回の役に立つのがFunction.prototype.bindメソッドです。
デモンストレーションとして、
2つ引数を取って合計値を返すadd
関数を作ってみます。
この関数の引数1個目だけを先に束縛して、値を1個入れるだけで実行される関数も作っていきます。
js
1function add (a, b) { return a + b; }
2
3console.log(add(3, 5));
4// 8
5
6var add5 = add.bind(null, 5);
7
8console.log(add5(10));
9// 15
bindメソッドの第一引数は関数を宣言する度にthisがコロコロ切り替わる、
thisの束縛&固定になっています。
不要な時はとりあえずnull値をセット。
そして第二引数以降に値を記述することで、
見事に第一引数のみを先に束縛した関数を返す事に成功しました。
つまり、こうすれば解決。
hogehogeは非常に簡素になりましたね。
js
1function hogehoge (category, data) {
2 console.log(data, category);
3}
4
5for (key in object) {
6 var category = object[key];
7 var url = '/json/data.json'
8 $.ajax({
9 url: url,
10 dataType: 'json'
11 })
12 .done(hogehoge.bind(null, category));
13}
関数ラッピング作戦
関数は宣言したスコープより上に探しに行きます。
なのでdoneの時点で無名関数を生成すれば、
その配下では普通にcategory変数が利用可能です。
こうしてラッピングした関数を手渡せば解決。
世のアプリは大抵コレでやっているので中々情報が出てこないんだと思います。
js
1function hogehoge (category, data) {
2 console.log(data, category);
3}
4
5for (key in object) {
6 var category = object[key];
7 var url = '/json/data.json'
8 $.ajax({
9 url: url,
10 dataType: 'json'
11 })
12 .done(function(data){
13 hogehoge(category, data);
14 });
15}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/21 07:04
2020/02/21 07:05