どのように我々は「閉鎖」内部平野JSに説明することができますか?

平和の話題を知るために読んで  、私たちは「閉鎖」内の平野JavaScriptで説明できますか?、いくつかのインスピレーション、その答えのいくつかの本質の例と解答することでより良く理解するための簡単な分析を行うため。

1.「閉鎖は、クロスアクセス変数のスコープです。」 

実施例[A]

VaRの名前は= 'wangxi'
 関数ユーザー(){
   // VAR名= 'wangxi' 
  関数のgetName(){ 
    にconsole.log(名)
  } 
  のgetName()
} 
ユーザー()// wangxi

getName関数名で取得し、最初のドメイン名のgetName機能の役割に注目が発見されていない場合、スコープのユーザー関数に見て、同じことが見つからない場合、バックアップし続け、グローバルスコープで名前を見つけたので、取得名前と印刷されます。ここではよく理解されていることを、あなたは同じ名前の最初のものを見つけるまで、スコープチェーンを介して親スコープで見て継続して、現在の役割に必要な変数を見つけることができない場合、変数は、指定した範囲内に存在します変数(スローのReferenceError、または見つけることができないまでエラー)これは、それはそれは反対の動作をした場合、親スコープは、その変数のサブスコープにアクセスしたいと思い、子スコープは、スコープチェーンの親変数のスコープにアクセスすることができますされ、スコープチェーンのコンセプトJSのですか?-これは閉鎖によって達成する必要があります。

実施例[2]

関数ユーザー(){
   VARの NAME = 'wangxi'
   リターン 機能のgetName(){
     戻り
  } 
} 

VARの userNameに= ユーザー()()
はconsole.log(ユーザ名)// wangxi

我々は、コード分析は、変数名は、変数名にアクセスすることができないが、閉鎖によって(関数を含む変数を返す(ここでグローバル)範囲外で、通常の状況下で、ユーザ関数の局所的な範囲に存在することを知っていますここで、あなたは)(内部への外部アクセスをクロススコープの変数にアクセスすることができます)のgetName機能です。したがって、上記のこの文は完全なものとして理解されるべきです。

スコープクロージャは、クロスアクセス変数である - 外部(以上)の変数の効果は、内部スコープの範囲外でアクセスできるように内部基準ドメイン可変範囲を維持することができます。(または単語が分析を見て理解していません)

 

2.「閉鎖:環境祖父で行われる父が、私の父は父の放出をもたらす、私の父は、環境の父が除去されなければならないオーバーが実行されていた、孫を返したが、彼の父の孫環境を引用することはできませんしこりはクロージャである。簡単に言えば、クロージャは、オブジェクトの親環境への参照であり、環境中の上位レベルのオブジェクトに親が戻るから環境。 "

これはどのようにそれを理解しますか?以下のコードではまず見て:

関数ユーザー(){
   VARの NAME = 'wangxi'
   戻り
} 

VARの userNameに= ユーザー()
はconsole.log(ユーザ名)// wangxi

Q:これは、閉じたバッグですか?

回答:もちろんありません。私たちは、最初にどのような閉鎖そう理解しなければなりません。ビューの正式なポイントは、グローバルスコープ名にユーザー関数内のローカル変数を訪れたが、問題は、ユーザーが実行し、名前も関数内のローカル変数のライフサイクルが唯一存在することを、破壊されているようですが、文の周期関数では、関数は、関数内の変数は自動的に破棄され、破壊されます。

しかし、逆にクロージャの使用は、機能は、ライフサイクルの終わりに実行されますが、クロージャ変数の参照によって、外側のスコープはまだ存在してスコープの閉鎖の実装が破壊されるまで存在しますが、ここではローカル変数(クロージャが地球環境に参照閉鎖を引用した場合、スコープは、そのようなプログラムの終了として、だけ地球環境に破壊される、破壊され、ブラウザやその他の行為を閉じて)それが破壊されます。そのため、記憶喪失のために閉鎖を避けるために、それを手動で使用閉鎖後に破壊することをお勧めします。以上2つの例示的な例では、軽微な変更:

関数ユーザー(){
   VARの NAME = 'wangxi'
   リターン 機能のgetName(){
     戻り
  } 
} 

VARのuserName =ユーザー()()// のuserName変数名は常に参照を維持している 
にconsole.log(ユーザ名)// wangxi 

userNameの = nullを // 破壊閉鎖、メモリの解放

[なぜユーザー()()2つのブラケットは、以下のとおりです。実行ユーザ()関数は、ユーザー(で、名前の変数を取得するには、あなたがのgetName関数リターンを実行する必要がある、のgetNameを返します)()]

よるポイント2、コードを解析:ユーザー名変数(祖父)のグローバルスコープで作成し、ユーザ機能に保存し、最終的に結果を返し(すなわち、ローカル変数名の値)は、ユーザ()()(父)を実行する基準を、ユーザー()()、ユーザー環境(父)の実行後、通常の状況下では、名前(孫)を返すには、削除する必要がありますが、名前(孫)によって返される結果は、(環境の父を引用しているため名前がされている可能性があるため、ユーザーの環境につながる解放することはできません)ユーザのスコープに存在している()記憶喪失を引き起こす可能性があります。

だから、[「閉鎖環境での上位レベルのオブジェクトに親戻ってから、オブジェクトの親環境への参照、および環境です。」]どのように理解することは?

私たちは、別の言い方を:関数は、環境内の親オブジェクトを参照し、この機能では、環境のより高いレベルにオブジェクトを返す場合、この関数はクロージャです。

あるいは、上記の例を見てみましょう。

getName機能参照されたオブジェクトのユーザー(親)環境(変数名)、および関数名がグローバル環境変数(より上級の環境)に返され、そのため、閉鎖のgetNameです。

3.「JavaScriptの機能ではなく、その範囲で行われるよりも、それらが定義されている範囲で動作します。」 - 「はJavaScript Definitive Guideの」

この文は、変数へのクロージャの参照を理解するために非常に便利です。我々は、次の例を見て:

VaRの名= 'ショーペンハウアー'
 機能のgetName(){ 
  にconsole.log(名)
} 

関数がmyName(){
   VARの NAME = 'wangxi' 
  のgetName()
} 

がmyName()// ショーペンハウアー

あなたががmyName()と出力はあなたが思う結果が同じでないならば、あなたは、戻って言った以上のを見て、この文する必要があります

JavaScriptの機能ではなく、それらが実行される範囲よりも、それらが定義されている範囲で動作します

MYNAME実行、内部関数がのgetNameを行い、がmyName変数名の定義は、のgetNameの実装には影響を与えませんがのgetNameは、地球環境に定義されている、プリント内のgetName、グローバルスコープの名の下にまだあります。

私たちは、少し下のコードを変更しました:

VaRの名= 'ショーペンハウアー' 機能のgetName(){
   VARの名= 'アリストテレス
    のvarイントロ= 機能(){   // 这是一个闭包 
      はconsole.log( '私は' + 名)
   } の戻りイントロ
} 関数showMyName() {
    VARの名= 'wangxi'
    VARがmyName = のgetName()
   がmyName()
} 
showMyName()// 私はアリストテレスです


   


結果とあなたは同じだと思いますか?あなたの分析の結果は、スマート用に予約されています〜

 

上記のjs閉鎖の理解があり、間違っている場合、私を修正してください。最後に、セクションはほとんど知られている問題の閉鎖の概念についての質問に答えるために参照します。

著者:シャオシャオの  リンク:https://www.zhihu.com/question/34547104/answer/197642727

クロージャとは何ですか?

簡潔には、クロージャは、関数が他の関数スコープ変数は、典型的には、内側の機能層の機能を定義するアクセスすることができることを意味します。

なぜ我々は閉鎖が必要なのでしょうか?

ローカル変数は、共有することができず、長期保存、およびグローバル変数は、公害変数を引き起こす可能性があり、私たちは、変数の両方の長期保存のためのメカニズムを持っていると思っていと地球環境汚染を引き起こすことはありません。

機能

  • より多くのメモリを取ります
  • リリースされることは容易ではありません

ときに使用するには?

変数を再利用したいの両方、我々はグローバルな環境汚染を避けたいです

どのように使用するには?

  1. 外側の関数を定義し、ローカル変数パッケージが保護されています。
  2. インナー機能、外部変数の操作機能を定義します。
  3. 関数は、オブジェクト関数内層と外層関数が呼び出された返し、結果をグローバル変数に格納されています。

おすすめ

転載: www.cnblogs.com/ITCodeMonkey/p/11672557.html