ホームページ  >  記事  >  ウェブフロントエンド  >  JS クロージャエッセイ

JS クロージャエッセイ

舍。
舍。オリジナル
2017-08-11 14:57:531067ブラウズ

先 公式導入を開始する前に、クロージャに関するより難しいインタビューの質問を正式に導入し始めました:

Function Fun (n, O) {
Console.log (o)
Return {
Fun: Function (m) {
RETURN FUN (
)楽しみを返してください m,n);
, n); .fun(1).fun(2).fun(3);
var c = fun(0).fun(2); c.fun(3);
//質問 3 行 a、b、c の出力は何ですか?

(元のリンク: http://www.cnblogs.com/xxcanghai/p/4991870.html)
この質問は誰にとっても、特にしっかりとした基礎を持っていない初心者にとっては難しいものです。この fun 関数が何をするのかについて大まかに説明します (この記事の最後で分析します): まず、このオブジェクトは 2 番目のパラメーターを出力し、次にこのオブジェクトにメソッド fun を返します。このメソッドは fun(m,n) を返します -- 最も外側の関数の実行結果です。基本的な処理を大まかに理解していれば、大まかに分析できますが、クロージャについて話す前に、それについて話しましょう
js のスコープ チェーン:
すべての JS コード (グローバル コードまたは関数) (ここに注意してください。黒板をノックしてください!!!) には、スコープ チェーンが関連付けられています。この
スコープ チェーンは、オブジェクトのリストまたはリンクされたリストです。このオブジェクトのグループは、このコードのスコープ内の変数を定義します。js は変数解決の値を見つける必要があります)')。最初のオブジェクトで見つからない場合は、次のオブジェクトを検索します。
js のトップレベル コードでは、スコープ チェーンはグローバル オブジェクトで構成されます。ネストを含まない関数本体には、スコープ チェーン上に 2 つのオブジェクトがあります。1 つ目は関数がパラメーターとローカル変数を定義するオブジェクトで、2 つ目はグローバル オブジェクトです。上 - 上の 2 つの段落の内容は、JS の権威あるガイドから引用したもので、rhino ブック
が関数として定義されている場合、実際にはドメイン チェーンが保持されるというものです。この関数が呼び出されると、ローカル変数を格納するための新しいオブジェクトが作成され、そのオブジェクトが保存されたスコープ チェーンに追加され、関数呼び出しのスコープを表す新しい長いチェーンが作成されます。ネストされた関数の場合、
外部関数が呼び出されるたびにスコープ チェーンが異なり、外部関数が呼び出されるたびに内部関数のコードが同じになり、
が関連付けられます。コードセグメントのスコープチェーンも異なります。是-上記の内容も JS の権威あるガイド、つまり rhino 本
からのもので、おそらく各関数がドメイン チェーンを形成し、ドメイン チェーンが異なり、アクセスできるコンテンツが同じではないことが要約されています。オブジェクトの
ソート関係に基づいて変数にアクセスする場合、近接原則という 1 つの原則に従うことができます。
スコープについて話した後、クロージャについて話しましょう。
つまり、わかりにくいスコープ チェーンがクロージャの原因です。
非常に簡単な例を見てみましょう:
var d;
function otter(){
var c = 0;
console.log(c);
d = function(){ c++;                                                                                                                                                                                                                                   一般に、js 関数が呼び出されるたびに、ローカル変数を保存するために新しいオブジェクトが作成され、関数が返されると、このオブジェクトはスコープ チェーンから削除されます。ネストされた関数がなく、このバインディング オブジェクトを参照する他の参照がない場合は、ガベージ コレクションが行われます。ネストされた関数が定義されている場合、各ネストされた関数は独自のスコープ チェーンを形成し、このスコープ チェーンは変数バインディング オブジェクトを指します。これらのネストされた関数オブジェクトが外部関数に保存されている場合、それらも変数と同様にガベージ コレクションされます。それが指すバインディング オブジェクト。ただし、これらの入れ子関数が戻り値として返されるか、どこかのプロパティに格納される場合、入れ子関数を指す外部参照が存在します。これはガベージ コレクションとして扱われません。また、ポイントされた変数バインディング オブジェクトもガベージ コレクションとして扱われません。
したがって、上記のコードでは、outter を呼び出した後、外部変数 d がネストされた関数を参照するため、outter の実行が完了した後、d が指すネストされた
関数とそれが指す変数バインディング オブジェクトはリサイクルされません。 cはリサイクルされないので、将来の話があります。 。 。
クロージャの英語の説明をしてみましょう (以下は MDN の説明から抜粋したものです):

クロージャとは、関数とその
関数が宣言された語彙環境の組み合わせです

それは何を意味しますか?上記を直接翻訳すると、クロージャは関数と、その関数が宣言されている字句スコープ環境の組み合わせです。
冒頭で述べた質問について話しましょう:

function fun(n,o) {
console.log(o)
return {
fun:function(m){
return fun(m,n);
}
};
}
:
fun(0) => n = 0, o = 未定義;
console.log(o); = 未定義;print 未定義
return { fun: function(m){ return fun(m,n ) } }; => ネストされた関数を定義してスコープ チェーンを形成し、fun、m = 未定義、n = 0 によって参照され、このスコープ チェーンは返されたオブジェクトのプロパティによって保持されます
Fun(0):
関数:n、o)= 1、o = 0; : ... Return fun (m, n)} = & gt ; m = unknown,n =1; 上記と同様にスコープチェーンが保存されます
fun(0).fun(1).fun(2):
または、返されたオブジェクトの楽しい方法は次のとおりです。すると、print O は print 1 になります。 。 。 ️ " m, n) m = 3, n = 2
fun (n, o) = & gt; n = 3, o = 2
を呼び出し、o を出力して 2 を出力します。 。 。
…最後のbは、オブジェクトを返すと、オブジェクトを返すことであり、一般的に使用するキーの属性がありますこの属性はメソッドを呼び出します。
実際、最後の点が私が話したいことです。スキルや条件を誇示する必要がある場合は、クロージャを使用しないでください。
クロージャを使用している限り、それは描画していることを意味します。メモリ内にスペースがある場合、プログラムがそれを使用する必要はありませんが、コンピュータの実行中に他のプログラムがそのスペースを使用することはできず、プログラムのパフォーマンスに影響を与えることは間違いありません。

以上がJS クロージャエッセイの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。