問題タブ [closures]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - C# のループでキャプチャされた変数
C# に関する興味深い問題に遭遇しました。以下のようなコードがあります。
0、2、4、6、8 を出力するはずですが、実際には 10 が 5 個出力されます。
キャプチャされた 1 つの変数を参照するすべてのアクションが原因のようです。その結果、それらが呼び出されると、すべて同じ出力が得られます。
この制限を回避して、各アクション インスタンスに独自のキャプチャ変数を持たせる方法はありますか?
javascript - Javascript リフレクション
javascript オブジェクトのすべてのメソッド (プライベート、特権、またはパブリック) を内部から取得する方法はありますか? サンプル オブジェクトは次のとおりです。
現在の問題は のコードですgetMethods()
。簡略化された例では、パブリック メソッドのみが返され、プライベート メソッドは返されません。
編集:私のテストコードは、私が望んでいることを過度に複雑にしている可能性があります(またはそうでない可能性があります)。以下が与えられます:
myFunction()
内からどの変数が存在するかを調べる方法はありますかmyFunction()
。擬似コードは次のようになります。
c++ - C++ の単純なテキスト メニュー
ライブラリの 1 つをテストするために、C++ でばかげた小さなアプリを作成しています。アプリでコマンドのリストをユーザーに表示し、ユーザーがコマンドを入力できるようにしてから、そのコマンドに関連付けられたアクションを実行したいと考えています。シンプルに聞こえます。C# では、コマンドのリスト/マップを次のように書くことになります。
C++ でこれを達成する方法について何か提案はありますか? コマンドごとに個別のクラス/関数を定義したくありません。Boost は使えますが、TR1 は使えません。
javascript - Firefox Javascript イベント匿名関数
ユーザーが HTML テーブルのセルをクリックしたときに匿名関数を登録しようとしています。生の、純粋なコードの一部を次に示します。
eval
これはループ内にあり、無名関数は毎回異なるため、 の使用に注意してください。
これは、Firefox 2 ではまったく問題なく動作します。しかし、Firefox 3 では、「関数」という単語の後の括弧内を指す「構文エラー」がスローされます。
これを修正する方法について、誰かが賢いアイデアを持っていますか?
私がやろうとしていることを明確にするために、非常に単純化された例を次に示します。
つまり、同じ関数を、それぞれに異なるパラメーター値でトリガーしたいと考えていますdiv
。
c# - 変更された閉鎖へのアクセス (2)
これはAccess から Modified Closure への質問の拡張です。以下が実際に本番環境で使用するのに十分安全かどうかを確認したいだけです。
起動ごとに1回だけ上記を実行します。今のところ、問題なく動作しているようです。ジョンが直感に反する結果について言及したように、場合によっては。では、ここで何に注意する必要がありますか?リストが複数回実行されても問題ありませんか?
javascript - JavaScript 匿名関数で宣言時に変数の値を使用するにはどうすればよいですか?
とても初歩的な質問ですが…
このようなコードがあります
これにより、divがバインドされ、クリックされたときにid="blah0"
すべての画像が変更されます。'blah.jpg'
同様に、 で div をクリックすると、id ="blah1"
すべての画像が に変わります'ha.jpg'
。
ただし、実行時に「i」の値、つまり 2 を使用するため、無名関数は機能しません。これは、いずれかの div をクリックすると、すべての画像を arr[2] に設定しようとすることを意味します。要素(興味深いことに、私のマシンでJSエラーをスローしていませんが、それは別の話です...)。
宣言時に「i」の値を使用して匿名関数を作成するにはどうすればよいですか?
より簡単な例として:
「blah0」をクリックすると「0」、「blah1」をクリックすると「1」などと表示されます。
ただし、デフォルトでは、どの「何とか」をクリックしても「10」が表示されます。
design-patterns - クロージャー/デリゲート/関数ポインターを使用してプログラミング言語でテンプレート メソッド パターンを使用しますか?
私は過去 8 年間、C# と Java の間を行ったり来たりしてきました。
私が驚くべきことの 1 つは、C# での "テンプレート メソッド" デザイン パターンの使用を完全にやめたことです。実際、C# では、このパターンをアンチパターンと考えるようになりました。
http://en.wikipedia.org/wiki/Template_method_pattern
Java に戻ると、このパターンは生きていて素晴らしいものであることがわかります。まだアンティークに見えると思いますが、Java でこれを行う方法は他にないことに気付きました。Javaもアンティークに見えます;)
これはとにかく出てくるので、なぜそれはアンチパターンなのですか?
- 多くの場合、「間違った理由」で継承階層を使い果たします。
- 基本クラスには、あらゆる種類の無関係なコードが散らばる傾向があります。
- 多くの場合、開発プロセスのかなり早い段階で、設計をロックダウンする必要があります。(多くの場合、時期尚早のロックダウン)
- 後の段階でこれを変更すると、ますます難しくなります。
したがって、クロージャー/デリゲート/関数ポインターを使用すると、通常、サブクラス化する代わりに関数を渡します。
質問に戻ります。
あなたの言語にクロージャー/デリゲート/関数がある場合、テンプレート メソッドを使用しますか? また、いつ使用しますか?
python - ネストされた関数で単体テストを実行する
私は、変数と関数を非表示にしてから、リフレクションを使用してそれらに対して単体テストを実行できる Java の世界から来ました。ネストされた関数を使用してクラスの実装の詳細を非表示にし、パブリック API のみが表示されるようにしました。これらのネストされた関数に対して単体テストを作成して、開発中に壊れないようにしようとしています。次のようなネストされた関数のいずれかを呼び出してみました。
エラーメッセージが表示されます:
AttributeError: 'function' オブジェクトに属性 'inner' がありません
これらのネストされた関数に対して単体テストを作成する方法はありますか? そうでない場合、__ を前に付けてクラス変数の場合と同じように、関数名の名前変更をトリガーする方法はありますか?
javascript - var self = this?
インスタンス メソッドをイベント ハンドラーのコールバックとして使用すると、スコープがthis
" My instance"から"Whatever just called the callback" に変更されます。だから私のコードは次のようになります
それは機能しますが、それが最善の方法ですか?私には奇妙に見えます。
javascript - JavaScript ループ内のイベント ハンドラー - クロージャーが必要ですか?
私は、他の誰かから引き継いだ HTML および Javascript コードを少し使用しています。ページは 10 秒ごとに (非同期要求を介して) データのテーブルを再読み込みし、DOM コードを使用してテーブルを再構築します。問題のコードは次のようになります。
onchange
ただし、要素に対してイベントが発生すると、テーブル内のすべてのメソッドに<select>
同じ値が渡されているように見えます (ループの各反復で、新しい個別の値が与えられていることを確認しました) 。onStatusChanged()
<select>
callid
anotherid
これは、構文を使用してイベント ハンドラーを設定する方法の性質が原因で発生していると思われselect.onchange = function()
ます。これがどのように正しく機能するかを理解していれば、この構文は onchange イベントのクロージャーをこれら 2 つの参照を参照する関数に設定し、最終的にはループの最後の繰り返しで設定されたものの最終値を持ちます。イベントが発生するcallid
と、 andによって参照されるanotherid
値は、個々の反復で設定された値ではなく、最後の反復で設定された値になります。
渡すパラメータの値をコピーする方法はありますonStatusChanged()
か?
質問と受け入れられた回答をよりよく反映するようにタイトルを変更しました。