問題タブ [lexical-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.

0 投票する
9 に答える
40264 参照

python - ラムダ関数とそのパラメーターの範囲は?

一連のGUIイベントとほぼ同じコールバック関数が必要です。関数は、どのイベントがそれを呼び出したかによって、わずかに異なる動作をします。私には単純なケースのように思えますが、ラムダ関数のこの奇妙な動作を理解することはできません。

したがって、以下の簡略化されたコードがあります。

このコードの出力は次のとおりです。

私は期待しました:

なぜイテレータを使用すると物事が台無しになったのですか?

ディープコピーを使用してみました:

しかし、これには同じ問題があります。

0 投票する
3 に答える
169 参照

javascript - このスコープはjavascriptで可能ですか?

私はjavascriptフレームワークに取り組んでいます。次のような独立したスクリプトがいくつかあります。

この関数は別の外部スクリプトから呼び出されます。変数にアクセスできるように、この関数に変数を渡そうとしていますwithout using the this keyword.

上記の例では、wot が未定義であるというエラーが発生します。

関数を匿名関数でラップし、そこで変数を宣言すると、期待される望ましい結果が得られます

私がやろうとしているのは、変数をスコープチェーンのさらに上に宣言して、2番目の例のように this キーワードを使用せずにモジュールでアクセスできるようにすることです。関数の宣言時に関数の実行範囲が封印されているように見えるので、これが可能だとは思いません。

update
どこで wot を定義しようとしているのかを明確にするために。別のJavaScriptファイルには、このような登録モジュール関数を呼び出すオブジェクトがあります

0 投票する
1 に答える
621 参照

lisp - マクロレット上の字句クロージャ?

マクロレットを使用して字句クロージャのようなことをする方法はありますか?私がやりたいのは、次のマクロをローカルの再帰ヘルパーにして、replでマクロを呼び出すようにリストを生成するのではなく、各組み合わせで関数を呼び出すことです。

私が欲しいのは、関数と任意の数のリストを受け取り、各組み合わせで関数を呼び出すネストされたループを生成するマクロです。私はlispにかなり慣れていません。これは、「nif」クローンなどを超えて作成した最初のマクロなので、提案をいただければ幸いです。

関数を受け取るマクロでマクロをマクロレットに変換しようとしましたが、行'(nreverse(list、item、@vars))'が'(func(nreverse(list、item、@vars))に置き換えられました))'しかし、funcは未定義の変数または関数であるというエラーが表示されます。

これは元の関数です:

これは私がマクロレットで試したものであり、未定義の関数'func'エラーが発生します。

0 投票する
4 に答える
523 参照

javascript - javascriptカリー化

引数の1つを適用して、任意の関数に適用して別の関数を返すことができるカレー関数を作成しようとしています。私が欲しいプロパティ:

  1. 関数に引数が1つしかない場合、curry関数は値を返す必要があります。f(a); カレー(f、x)= f(x);
  2. 関数に多くの引数がある場合、curreyはcurried関数を再実行する必要があります:g(a1、a2、..、aN); カレー(g、x)= g2(a2、..、aN):g2(a2、.. aN)= g(x、a2、...、aN)
  3. カレー化された関数の長さは「必要に応じて」機能する必要がありますg.length=N => curry(g、x).length = N-1

Prototype Frameworkにはカレーの実装がいくつかあり、1つのブログで議論されています。ただし、この実装は、引数が1つしかない関数(1)ではうまく機能せず、関数の'length'属性が0(3)を返すため、適切ではありません。

最初のプロパティには、簡単な実装があります。

しかし、3番目のルールを操作する方法がわかりません。つまり、ネストされた字句環境があり、fを使用できるため、関数を内部関数として構成できます。

ただし、この場合、パラメーターを明示的に設定することはできなくなります。一方、関数は「newFunction」ステートメントで作成できます。smthは次のようになります。

ただし、この状況では、無名関数がグローバルレキシカル環境で作成されるため、fとxはバインドされません。

だから質問:

  1. functionキーワードで関数を作成するときにパラメータカウントを明示的に設定する方法はありますか?
  2. 'new Function'ステートメントで作成された関数の環境を設定する方法はありますか?
  3. 他の方法で私の問題を解決する方法はありますか?
0 投票する
2 に答える
112 参照

javascript - 変数のスコープが間違っています (おそらくクロージャが必要ですか?)

クロージャーが必要な次のコードがあります。

何が起こるかというと、アイテムがクリックされるたびに、i に対して常に同じ番号をプレビューするということです

私がしなければならないことは

そして、onclick を次のように割り当てます。

しかし、その後this、私のリンクを参照しなくなります...この問題はどのように解決されますか?

0 投票する
3 に答える
268 参照

python - Pythonクロージャの奇妙な動作

Pythonの字句クロージャの質問からコードを試しています

出力は次のとおりです。

すべきではないですか?:

次のコードを使用して上記の出力を取得しました。

Python 2.6.6(r266:84292、2010年9月15日、15:52:39)を使用しています。

0 投票する
6 に答える
48026 参照

c++ - C++ にクロージャはありますか?

私はネット上の閉鎖について読んでいました。C++ にクロージャ用の組み込み機能があるかどうか、または C++ でクロージャを実装できる方法があるかどうか疑問に思っていました。

0 投票する
3 に答える
161 参照

c++ - ラムダ関数を使用してレキシカルクロージャーをシミュレートすると、予期しないパフォーマンス/実装の問題がありますか?

プログラム 1:

関数 Hello() および World() は、グローバル名前空間に存在します。
これは、宣言の後に続く他の関数から呼び出すことができることを意味します (または、この場合、定義を提供し、最初に宣言する必要はありませんでした)。

これには問題があります。プロジェクトが大きくなるにつれて、グローバル名前空間を多くの関数で埋めるヘッダー ファイルが増えるため、関数シグネチャの競合が発生したり、さらに悪いことに、呼び出されるだけのはずの間違った関数を誤って呼び出したりするリスクがあるためです。別の機能のサブタスクとして。

私は、タスクを機能的にサブタスクに分解するパラダイムに従おうとしているため、特定の関数が別の特定の関数の範囲外で呼び出されることは意味がありません。

ここに回避策があります。インデントの深さのためにコードが読めなくなることは別として、パフォーマンスまたは実装上の落とし穴があるかどうかを知りたいです。現時点ではラムダ関数はちょっとした魔法のようなものなので、予期せぬ危険性に興味があります。

プログラム 2:

Hello() と World() は main() 内にカプセル化されており、main() のスコープ外から呼び出すことはできません。
違うのはそれだけ?

0 投票する
4 に答える
2071 参照

lisp - Emacs Lisp:なぜこのsexpがinvalid-functionエラーを引き起こすのですか?

問題の性別は

私には、これは に評価されるように見えますが8、他の Lisp (Racket など) では評価されますが、elisp では代わりに次のエラーがスローされます。

と伝えているようです

有効な関数ではありません。これは間違っているようです。その式を評価すると、

これは私にとって有効な機能のように見えます。なぜこれが起こるのか誰にも分かりますか?動的スコープと関係がありますか?

0 投票する
4 に答える
9265 参照

javascript - JavaScript のレキシカル スコープ/クロージャ

「js」の関数には字句スコープがあることを理解しています(つまり、関数は、実行時ではなく定義時に環境(スコープ)を作成します)。

「f()」だけを実行すると、内部関数が返されます。私が得たのは、それが 'return' の機能です!

「ReferenceError: b が定義されていません」というメッセージが表示されるのはなぜですか? しかし、上記の内部関数はそのスペース、f() のスペースなどにアクセスできません。「b」がグローバル スペースに返されているため、console.log() は機能しませんか?

ただし、「f()」を新しい変数に割り当てて実行すると、次のようになります。

これは「barb」である「b」を返しますが、console.log() を再度実行すると、「ReferenceError: 'b' is not defined」が返されます。'b' が返されたので、グローバル スコープに含まれていませんか? では、なぜ 'x()' も 'f()' と同じように内部関数を返さなかったのでしょうか?