JavaScript - 実際の開発におけるクロージャの用途は何ですか?
PHPz
PHPz 2017-05-16 13:35:00
0
9
920

ビデオでクロージャの機能の説明を見た後でも、まだ理解できません。たとえば、スクリーンショットのコードは、cmp 関数にパスラインパラメータを追加することで実装できます。クロージャを使用する必要はありません。

クロージャの役割を説明するために、これより良い例をあげられる人は誰でしょうか?

PHPz
PHPz

学习是最好的投资!

全員に返信(9)
过去多啦不再A梦

ローカル変数のライフサイクルを延長し、プライベート変数をカプセル化します

リーリー
いいねを押す +0
伊谢尔伦

変数の保存。ほとんどの場合、変数の汚染を避けるためにグローバル変数を置き換えるのに使用します

いいねを押す +0
巴扎黑

クロージャによって解決される問題: JS字句スコープルールに基づいて、そのアクセスはグローバルスコープまでスコープを上方に検索することです。特定のスコープに直接アクセスしたい場合は、クロージャを使用できます。

リーリー

bar の字句スコープは、foo の内部スコープにアクセスできます。 foo が実行されると、bar が返されます。そして最後にそれを baz に割り当て、 foo の内部スコープを取得してアクセスできますが、識別子は異なります。 bar词法作用域可以访问foo内部作用域,foo执行后返回bar,最后赋值给baz,可以获取并访问foo内部作用域,只是标识符不同而已。
该代码就使用了闭包,可以说写JSこのコードはクロージャを使用しています。コードを作成するときにクロージャが随所に見られると言えます。クロージャを使用するもう 1 つの利点は、不当な使用によってメモリが消費されないことです。

クロージャは、 変数を追加する (特定のスコープにアクセスできれば、自然に変数を追加できます) ライフサイクルを拡張する (スコープが参照されると、自然に拡張されます)

に使用されます。 リーリー

最初のループはいくつかの関数を宣言しており、共有グローバル i变量(变量和函数声明都提升了)。
第二个循环是定义了几个立即执行函数,又传递了i值,故每个i 値には独自のスコープがあります。
これはクロージャ + ループのより良い例ですが、これは特別であり、クロージャは独自のスコープにアクセスします。

もちろん、クロージャのアイデアを最もよく体現するモジュールは、スコープを効果的に導入するメソッドを返すモジュールです。

クロージャ: 外部または内部からアクセスできる特定のスコープを取得してアクセスする方法です。

いいねを押す +0
Ty80

2つの最大の機能

  1. 関数の内部変数を読み取る

  2. 変数値を常にメモリに保持します

最初のものについては詳しく説明しませんが、例として 2 つ目を見てください

リーリー

結果は実際にはクロージャ f2 関数です。これは 2 回実行され、1 回目の値は 999、2 回目の値は 1000 でした。これは、関数 f1 のローカル変数 n が常にメモリに格納され、f1 が呼び出された後に自動的にクリアされないことを証明します。
なぜこれが起こっているのですか?その理由は、f1 が f2 の親関数であり、f2 がグローバル変数に割り当てられているため、f2 は常にメモリ内に存在し、f2 の存在は f1 に依存するため、f1 は常にメモリ内にあり、削除されないためです。呼び出しが完了すると、ガベージ コレクション メカニズム (ガベージ コレクション) によってリサイクルされます。
このコードでもう 1 つ注目すべき点は、「nAdd=function(){n+=1}」という行です。まず、var キーワードが nAdd の前に使用されていないため、nAdd はローカル変数ではなくグローバル変数です。第二に、nAdd の値は匿名関数であり、この匿名関数自体もクロージャであるため、nAdd は関数の外部から関数内のローカル変数を操作できるセッターと同等です

  • プライベート変数とプライベートメソッドを管理し、安全な環境で変数(状態)への変更をカプセル化します

  • コードをクロージャーフォームにカプセル化し、カリー化やデカリー化の実装など、適切なときに使用されるのを待ちます

  • 注意事項:

    • クロージャ内の一部のリソースは自動的に解放できないため、メモリ リークが発生しやすく、解決策は関数を終了する前に未使用のローカル変数をすべて削除することです。

    • クロージャは、親関数内の変数の値を親関数の外で変更します。したがって、親関数をオブジェクトとして使用し、クロージャをそのパブリック メソッドとして使用し、内部変数をプライベート値として使用する場合は、親関数内の変数の値を自由に変更しないように注意する必要があります。

いいねを押す +0
世界只因有你

set_passLine は実際には 2 つのパラメーターの関数であると言ったら、受け入れられますか?

リーリー

この和関数

リーリー

は機能的に同等ですが、前者はすべてのパラメータを指定して一度に呼び出す必要はありません。

さらに、最初の書き方はクラスと同じ機能を実現できます:

リーリー

これらは同じ機能の異なる実装ですが。しかし、関数型プログラミングが他の方法よりも優れているということは、コード サイズの点でより優れており、より明確であるということを人々はますます認識しています (ただし、プログラマーに対する要件はますます高くなっています)。

リンクを教えてください。ただし、js で書きました: http://zonxin.github.io/post/...

追伸
オブジェクト指向プログラミングとは、すべての「オブジェクト」をオブジェクトとみなして、オブジェクトを使って「オブジェクト」の振る舞いをシミュレートすること、つまり、ある「世界」の動作をシミュレートすることです。
関数型プログラミングは、「オブジェクト」の初期状態と関数を通過した後の「オブジェクト」の最終状態のみを考慮し、これらの関数の構成を扱うのがプログラミングです。

いいねを押す +0
滿天的星座

私は常にこのように理解してきました: 内部変数を保護し、公開された API を通じて操作します。

リーリー

上記は私の個人的な理解です

いいねを押す +0
Ty80

変数汚染を避けてください。ただし、ES6 にある場合は、let と const を使用してこの問題を解決してください

いいねを押す +0
大家讲道理

初級レベルでは
私が知っているのは、1. ローカル変数にアクセスできる
2. ローカル変数はいつでもメモリに保存できるということだけです

メモリリークを引き起こす可能性があるため、使用頻度が高すぎないように注意してください

いいねを押す +0
PHPzhong

印象に残ったことを答えてください偏函数

リーリー
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート