ビデオでクロージャの機能の説明を見た後でも、まだ理解できません。たとえば、スクリーンショットのコードは、cmp 関数にパスラインパラメータを追加することで実装できます。クロージャを使用する必要はありません。
クロージャの役割を説明するために、これより良い例をあげられる人は誰でしょうか?
学习是最好的投资!
ローカル変数のライフサイクルを延長し、プライベート変数をカプセル化します
変数の保存。ほとんどの場合、変数の汚染を避けるためにグローバル変数を置き換えるのに使用します
クロージャによって解決される問題: JSの字句スコープルールに基づいて、そのアクセスはグローバルスコープまでスコープを上方に検索することです。特定のスコープに直接アクセスしたい場合は、クロージャを使用できます。
JS
bar の字句スコープは、foo の内部スコープにアクセスできます。 foo が実行されると、bar が返されます。そして最後にそれを baz に割り当て、 foo の内部スコープを取得してアクセスできますが、識別子は異なります。 bar词法作用域可以访问foo内部作用域,foo执行后返回bar,最后赋值给baz,可以获取并访问foo内部作用域,只是标识符不同而已。该代码就使用了闭包,可以说写JSこのコードはクロージャを使用しています。コードを作成するときにクロージャが随所に見られると言えます。クロージャを使用するもう 1 つの利点は、不当な使用によってメモリが消費されないことです。
bar
foo
baz
クロージャは、 変数を追加する (特定のスコープにアクセスできれば、自然に変数を追加できます) ライフサイクルを拡張する (スコープが参照されると、自然に拡張されます)
最初のループはいくつかの関数を宣言しており、共有グローバル i变量(变量和函数声明都提升了)。第二个循环是定义了几个立即执行函数,又传递了i值,故每个i 値には独自のスコープがあります。 これはクロージャ + ループのより良い例ですが、これは特別であり、クロージャは独自のスコープにアクセスします。
i
もちろん、クロージャのアイデアを最もよく体現するモジュールは、スコープを効果的に導入するメソッドを返すモジュールです。
クロージャ: 外部または内部からアクセスできる特定のスコープを取得してアクセスする方法です。
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 は関数の外部から関数内のローカル変数を操作できるセッターと同等です
プライベート変数とプライベートメソッドを管理し、安全な環境で変数(状態)への変更をカプセル化します
コードをクロージャーフォームにカプセル化し、カリー化やデカリー化の実装など、適切なときに使用されるのを待ちます
注意事項:
クロージャ内の一部のリソースは自動的に解放できないため、メモリ リークが発生しやすく、解決策は関数を終了する前に未使用のローカル変数をすべて削除することです。
クロージャは、親関数内の変数の値を親関数の外で変更します。したがって、親関数をオブジェクトとして使用し、クロージャをそのパブリック メソッドとして使用し、内部変数をプライベート値として使用する場合は、親関数内の変数の値を自由に変更しないように注意する必要があります。
set_passLine は実際には 2 つのパラメーターの関数であると言ったら、受け入れられますか?
set_passLine
この和関数
は機能的に同等ですが、前者はすべてのパラメータを指定して一度に呼び出す必要はありません。
さらに、最初の書き方はクラスと同じ機能を実現できます:
これらは同じ機能の異なる実装ですが。しかし、関数型プログラミングが他の方法よりも優れているということは、コード サイズの点でより優れており、より明確であるということを人々はますます認識しています (ただし、プログラマーに対する要件はますます高くなっています)。
リンクを教えてください。ただし、js で書きました: http://zonxin.github.io/post/...
追伸オブジェクト指向プログラミングとは、すべての「オブジェクト」をオブジェクトとみなして、オブジェクトを使って「オブジェクト」の振る舞いをシミュレートすること、つまり、ある「世界」の動作をシミュレートすることです。 関数型プログラミングは、「オブジェクト」の初期状態と関数を通過した後の「オブジェクト」の最終状態のみを考慮し、これらの関数の構成を扱うのがプログラミングです。
私は常にこのように理解してきました: 内部変数を保護し、公開された API を通じて操作します。
上記は私の個人的な理解です
変数汚染を避けてください。ただし、ES6 にある場合は、let と const を使用してこの問題を解決してください
初級レベルでは私が知っているのは、1. ローカル変数にアクセスできる2. ローカル変数はいつでもメモリに保存できるということだけです
メモリリークを引き起こす可能性があるため、使用頻度が高すぎないように注意してください
印象に残ったことを答えてください偏函数
偏函数
ローカル変数のライフサイクルを延長し、プライベート変数をカプセル化します
リーリー変数の保存。ほとんどの場合、変数の汚染を避けるためにグローバル変数を置き換えるのに使用します
クロージャによって解決される問題:
リーリーJS
の字句スコープルールに基づいて、そのアクセスはグローバルスコープまでスコープを上方に検索することです。特定のスコープに直接アクセスしたい場合は、クロージャを使用できます。bar
の字句スコープは、foo
の内部スコープにアクセスできます。foo
が実行されると、bar
が返されます。そして最後にそれを baz に割り当て、foo
の内部スコープを取得してアクセスできますが、識別子は異なります。bar
词法作用域可以访问foo
内部作用域,foo
执行后返回bar
,最后赋值给baz
,可以获取并访问foo
内部作用域,只是标识符不同而已。该代码就使用了闭包,可以说写
JS
このコードはクロージャを使用しています。コードを作成するときにクロージャが随所に見られると言えます。クロージャを使用するもう 1 つの利点は、不当な使用によってメモリが消費されないことです。クロージャは、 変数を追加する (特定のスコープにアクセスできれば、自然に変数を追加できます) ライフサイクルを拡張する (スコープが参照されると、自然に拡張されます)
に使用されます。 リーリー最初のループはいくつかの関数を宣言しており、共有グローバル
i
变量(变量和函数声明都提升了)。第二个循环是定义了几个立即执行函数,又传递了
i
值,故每个i
値には独自のスコープがあります。これはクロージャ + ループのより良い例ですが、これは特別であり、クロージャは独自のスコープにアクセスします。
もちろん、クロージャのアイデアを最もよく体現するモジュールは、スコープを効果的に導入するメソッドを返すモジュールです。
クロージャ: 外部または内部からアクセスできる特定のスコープを取得してアクセスする方法です。
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 は関数の外部から関数内のローカル変数を操作できるセッターと同等です
プライベート変数とプライベートメソッドを管理し、安全な環境で変数(状態)への変更をカプセル化します
コードをクロージャーフォームにカプセル化し、カリー化やデカリー化の実装など、適切なときに使用されるのを待ちます
注意事項:
クロージャ内の一部のリソースは自動的に解放できないため、メモリ リークが発生しやすく、解決策は関数を終了する前に未使用のローカル変数をすべて削除することです。
クロージャは、親関数内の変数の値を親関数の外で変更します。したがって、親関数をオブジェクトとして使用し、クロージャをそのパブリック メソッドとして使用し、内部変数をプライベート値として使用する場合は、親関数内の変数の値を自由に変更しないように注意する必要があります。
set_passLine
は実際には 2 つのパラメーターの関数であると言ったら、受け入れられますか?この和関数
リーリーは機能的に同等ですが、前者はすべてのパラメータを指定して一度に呼び出す必要はありません。
さらに、最初の書き方はクラスと同じ機能を実現できます:
リーリーこれらは同じ機能の異なる実装ですが。しかし、関数型プログラミングが他の方法よりも優れているということは、コード サイズの点でより優れており、より明確であるということを人々はますます認識しています (ただし、プログラマーに対する要件はますます高くなっています)。
リンクを教えてください。ただし、js で書きました: http://zonxin.github.io/post/...
追伸
オブジェクト指向プログラミングとは、すべての「オブジェクト」をオブジェクトとみなして、オブジェクトを使って「オブジェクト」の振る舞いをシミュレートすること、つまり、ある「世界」の動作をシミュレートすることです。
関数型プログラミングは、「オブジェクト」の初期状態と関数を通過した後の「オブジェクト」の最終状態のみを考慮し、これらの関数の構成を扱うのがプログラミングです。
私は常にこのように理解してきました: 内部変数を保護し、公開された API を通じて操作します。
リーリー上記は私の個人的な理解です
変数汚染を避けてください。ただし、ES6 にある場合は、let と const を使用してこの問題を解決してください
初級レベルでは
私が知っているのは、1. ローカル変数にアクセスできる
2. ローカル変数はいつでもメモリに保存できるということだけです
メモリリークを引き起こす可能性があるため、使用頻度が高すぎないように注意してください
印象に残ったことを答えてください
リーリー偏函数