検索

ホームページ  >  に質問  >  本文

JavaScript - 実際の開発におけるクロージャの用途は何ですか?

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

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

PHPzPHPz2815日前990

全員に返信(9)返信します

  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-16 13:37:00

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

    リーリー

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-05-16 13:37:00

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

    返事
    0
  • 巴扎黑

    巴扎黑2017-05-16 13:37:00

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

    リーリー

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

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

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

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

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

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

    返事
    0
  • PHP中文网

    PHP中文网2017-05-16 13:37:00

    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
  • 世界只因有你

    世界只因有你2017-05-16 13:37:00

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

    リーリー

    この和関数

    リーリー

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

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

    リーリー

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

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

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

    返事
    0
  • 滿天的星座

    滿天的星座2017-05-16 13:37:00

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

    リーリー

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

    返事
    0
  • PHP中文网

    PHP中文网2017-05-16 13:37:00

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

    返事
    0
  • 大家讲道理

    大家讲道理2017-05-16 13:37:00

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

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

    返事
    0
  • PHPz

    PHPz2017-05-16 13:37:00

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

    リーリー

    返事
    0
  • キャンセル返事