問題タブ [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 投票する
1 に答える
16417 参照

javascript - 引数変数を使用して ES6 アロー関数に渡される引数を取得する

ES6 でアロー関数がどのように機能するか、およびレキシカルな this を理解していますが、アロー関数に渡される引数を取得する方法を誰かが知っているかどうか疑問に思っていましたか?

ES5 では、次のように簡単に実行できます。

ただし、ES6 でアロー関数を使用すると、次のようになります。

変数はオブジェクトを返しますが、これargumentsはパラメーターに近いものではありません。

それで、誰かがアロー関数に渡された引数を取得する方法を持っているかどうか疑問に思っていましたか?


編集

おそらく、私が達成しようとしていることについていくつかの情報を提供する必要があると思います.上記が不可能な場合は、誰かがより良いアイデアを持っています.

基本的に、IIEF を BluebirdJS のasCallbackメソッドに追加しています。これは、提供されたコールバックが実際にあったかどうかを判断し、提供されていない場合は promise を返します。

ES5 での作業例を次に示します。

したがって、すべての ES5 関数を使用すると問題なく動作し、必要に応じて IIEF やその内部でそれらを使用してもかまいません。しかし、これはarguments、ES5関数として実際に使用したくない関数内の変数にかかっています。むしろ、ES6 Arrow関数に固執します。したがって、ES6アロー関数で引数を取得するES6の方法があれば、それは完璧です!

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

javascript - Javascript レキシカルスコープ

レキシカルスコープの概念を理解しようとしています。私の知る限り、レキシカルスコープは逆方向には機能しません。以下の JavaScript コードでは、scope3() 関数で変数 'name' を宣言しています。しかし、scope1() および scope2() 関数で呼び出そうとしました。レキシカル スコープは逆方向には機能しないため、"name is undefined" を取得する必要がありましたが、空の文字列が返されます。誰かがこれを説明できますか?

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

swift - NSUndoManager を使用して、Swift クロージャを使用して取り消しを登録する方法

NSLayoutManagerSwiftクロージャーを使用して使用する方法を理解しようとしています。undo次のように正常に登録できます。

もちろんredo、アンドゥのアンドゥに相当するものをサポートする必要があります。私はそれを行うことができます:

しかし今、やり直しの取り消しをサポートする必要があります...うーん....わかりました:

ご覧のとおり、その「カメがずっと下に」。この狂気から逃れるにはどうすればいいですか?つまり、私が見つけることができるすべてのサンプルコードで、コードのセレクターバージョンを使用して、それ自体を元に戻すことができるメソッドを登録します-これは、私が使用しているクロージャーメソッドでは明らかに実行できません...クロージャーをどのように使用しますか?バージョンと無制限の元に戻す/やり直しを取得しますか?

0 投票する
2 に答える
300 参照

lambda - レキシカルクロージャーを使用したラケット

Let over Lambda でレキシカル クロージャについて読んだところ、Common Lisp 用に次のコード サンプルが提供されました。

これをRacketで次のように書いてみました:

counterエラーが発生するため、REPLで呼び出すと:

私が理解している限りでは、let/set と lambda を混在させると、感覚からの入力によって人間の記憶を処理および変更できるのと同じ方法で、他の関数によって処理できる状態を lambda に保存することができます。LISP プログラムに、他の関数との相互作用によって変更されるコードの一部を含めることに興味があります。これがラムダによって行われなくても、Racket やその他の LISP 方言の重要な部分であるように見えるので、それ (ラムダ関数) を理解したいと思っています。

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

python - メソッドをオブジェクト ランタイム レイト バインディングにバインドする

Python のループの遅延バインディングについては認識していますが、これを解決する方法が見つかりません。

私はで試してみましたが、成功partialfunctoolsませんでした:(

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

javascript - ネストされた関数、クロージャ、およびスコープ

私はスコープ、特にクロージャーに頭を悩ませようとしてきました。このトピックに関する投稿がたくさんあることを知っており、たくさん読んでいます。しかし、ほとんどの場所では、このトピックを高度なトピックと呼んでおり、比較的理解しにくい用語を使用しています。関数が実際にどのように機能するかについて間違った考えを持って、より複雑なトピックに踏み込むことがないように、基本を正しく理解していることを絶対に確認したいと思います。

だから...私は基本的な機能を選びました.ボンネットの下で起こっていると思うことが実際に起こっていることであるかどうか誰かに教えてもらいたいです.

これはコードです:

(実際には合計を行うわけではないことを知っています。各ステップで何が起こっているのかを理解しようとするために微調整しました。)

したがって、私の主な疑問は、なぜ A が 2 ではなく 1 であったかということでした。によって返された直後に、引数としてfunction(b)取るために が作成されるとすぐに、クロージャーが作成されるという結論に達しました。したがって、クロージャーの定義により、関数が作成された時点で、レキシカル環境も保存されると想定しています ( where )。これは正しいですか?sum(2)sum(1)a = 1

手順を図にしました。

ダイアグラム

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

javascript - この JavaScript 関数のペアはどのように違うのでしょうか?

JavaScript クロージャがどのように機能するかを正確に理解するのに苦労しています。これら 2 つの関数を見て、複数回呼び出すとまったく異なる結果が生成されるという違いを教えてください。

機能 1

機能 2