[過去ログ] + JavaScript(ECMAScript)質問用スレッド vol.123 + [無断転載禁止]©2ch.net (551レス)
前次1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
125
(3): デフォルトの名無しさん [sage] 2021/02/17(水) 22:01:08.47 ID:3Rkqt+9c(1) AAS
>>121
121(4): デフォルトの名無しさん [] 2021/02/17(水) 13:56:56.26 ID:bo7LOn7s(1) AAS
クロージャーつかって関数内の静的変数つくるテクニックあるじゃん
あれって無駄にややこしくない?
クロージャー使わないでオブジェクト使えばいいんじゃないか?
静的変数と関数を両方オブジェクトのメンバーにすれば
const makeCounter = (count=0) => () => count += 1
const counter = makeCounter(10)
counter() //=> 11
counter() //=> 12
counter() //=> 13

よくあるような例だけどクロージャ使わない方法でやってみて
128
(5): デフォルトの名無しさん [] 2021/02/18(木) 09:19:29.54 ID:BYtePDJa(2/12) AAS
>>125
こんな感じ

function myCounterClass(init=0)
{
this.value = init;
this.count = function () {this.value++;};
}

var mycounter = new myCounterClass(10);

mycounter.count();
mycounter.count();
mycounter.count();

document.write(mycounter.value);
137
(1): デフォルトの名無しさん [] 2021/02/18(木) 12:01:38.80 ID:BYtePDJa(6/12) AAS
>>133
133(1): デフォルトの名無しさん [sage] 2021/02/18(木) 10:38:43.56 ID:Ld9H4alj(1) AAS
静的変数ってJavaやC#のstaticの事言ってるんだろうけど、そのJSのはメンバー変数相当
その通り >>125 >>128 みたいな用途
javascriptでクロージャを使う例としてこういうのが出てくる

cなら関数内のstatic変数でやれるやつ
141
(1): デフォルトの名無しさん [] 2021/02/18(木) 12:27:08.76 ID:BYtePDJa(7/12) AAS
>>138
138(2): デフォルトの名無しさん [sage] 2021/02/18(木) 12:03:18.73 ID:vQ0bM4Ab(1/2) AAS
>>128
機能的に同じにするなら++は前置でreturnが必要
this.count = function () {return ++this.value;};

クロージャを使わないとthisとnewというJavaScript的にはややこしいものが必要になる
newを忘れるとサイレントにバグる
thisを使ってるのでイベントハンドラやsetIntervalなど関数を受け取る関数にそのまま渡せない

クラスベースになれてるとわかりやすいと感じるかもしれないけど
JavaScript的にはほぼメリットが無いのでクロージャ使うほうが一般的
関数を作って関数を受け渡したい場合に必要もなくnewやthisを使うのは邪魔なので

インスタンスを大量に作るような場合は
prototypeに関数をおいて共有したいので単純なクロージャじゃなくclass相当のものを使う
return はそのとおりだ

mycounter.count() をイベントハンドラとして登録してもうまく行くぞ
>>125 のような用途でclosure使うのは、よくよく考えれば理解は出来るし慣れれば作法として普通に使えるようになるとは思うけど土臭く出来ることをエレガントにしようとして変なことになってる気がする
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 1.420s*