JavaScriptの閉鎖は本当に決まり文句の質問です。最近、私は自分の表現スキルについて尋ねてきましたが、それらを完全にサポートすることはできません。私は夢中だ。帰り道、私は突然非常に簡単なことを考えました。実際、プロジェクトを行っているとき、閉鎖を使用することがよくありますが、質問をするとき、答えはしばしば見つけられる答えです。悲しいかな、私たちがインタビューに対処しているか、本当に何かを学びたいのかにかかわらず、私はあなたと私自身の理解を共有し、執筆は避けられません。
1.閉鎖とは何ですか?
Red Baoの本は、「別の関数範囲で変数にアクセスする権利を有する関数を指します。」
簡単に言えば、JavaScriptは内部関数、つまり関数定義と関数式の使用を別の関数の関数本文に使用できます。さらに、これらの内部関数は、すべてのローカル変数、パラメーター、およびそれらが存在する外部関数で宣言されたその他の内部関数にアクセスできます。これらの内部関数のいずれかがそれらを含む外部関数の外部で呼び出されると、閉鎖が形成されます。簡単に言えば、「関数は内部に別の関数を作成し、後者の関数は上記の関数の変数を読み取り、後者の関数は「閉鎖」と呼ぶことができます」。
2。閉鎖の使用は何ですか?
私の広範なレビューを通じて、「閉鎖を使用することで多くのことを行うことができます。たとえば、オブジェクト指向のコードスタイルをシミュレートします。コードをよりエレガントかつ簡潔に表現し、いくつかの側面でコードの実行効率を改善します」と言うと、空っぽに感じますか?これらは良いでしょうか? JavaScriptには実際のブロックレベルの範囲はありませんが、機能のみを使用できるいくつかのローカル変数を宣言するために、閉鎖を使用して、グローバル範囲の変数を大幅に削減し、グローバル範囲を精製することができます。
ここにいくつかの例があります:
1。匿名の自己実行機能
すべての変数がVARキーワードで追加されていない場合、デフォルトがグローバルオブジェクトのプロパティに追加されることを知っています。このような一時的な変数をグローバルオブジェクトに追加することには、多くの欠点があります。
たとえば、他の関数はこれらの変数を誤用する場合があります。グローバルオブジェクトが大きすぎてアクセス速度に影響を与えます(変数の値をプロトタイプチェーンから移動する必要があるため)。
変数を使用するたびに、VARキーワードを使用します。実際の状況では、一部の機能を1回だけ実行する必要があり、その内部変数を維持する必要がない状況に遭遇することがよくあります。
たとえば、UIの初期化では、閉鎖を使用できます。
var data = {table:[]、tree:{}}; (function(dm){for(var i = 0; i <dm.table.rows; i ++){var row = dm.table.rows [i]; for(var j = 0; j <row.cells; i ++){drawcell(i、j);}}}})(data);匿名関数を作成し、すぐに実行します。外部はその内部の変数を参照できないため、関数が実行された直後にリソースがリリースされます。重要なのは、グローバルオブジェクトを汚染しないことです。
2。結果キャッシュ
開発中の多くの状況に遭遇します。各呼び出しを処理するのに長い時間がかかる非常に時間のかかる関数オブジェクトがあると想像してください。次に、計算値を保存する必要があります。この関数を呼び出すとき、最初にキャッシュを見上げます。見つからない場合は、計算を実行し、キャッシュを更新して値を返します。見つかった場合、見つかった値を直接返すことができます。閉鎖は、外部参照をリリースしないため、正確にこれを行い、関数内の値を保存できるようにします。
var cachedsearchbox =(function(){var cache = {}、count = []; return {adticlesearchbox:function(dsid){if(dsid in cache){//キャッシュ[fsb; //キャッシュを更新する{//セキュリティサイズ<= 100削除[count.shift)] cachedsearchbox.attachsearchbox( "input");このようにして、2回目の呼び出しでキャッシュからオブジェクトを読み取ります。
3。パッケージ
var person = function(){//変数のスコープは関数内にあり、var名に外部にアクセスすることはできません。 var name = "default"; return {getName:function(){return name; }、setName:function(newName){name = newName; }}}(); print(person.name); //直接アクセス、結果は未定義のprint(person.getname()); person.setname( "abruzzi"); print(person.getName());4.クラスと継承を実装します
function person(){var name = "default"; return {getName:function(){return name; }、setName:function(newName){name = newName; }}}; var p = new person(); P.SetName( "Tom"); alert(p.getname()); var Jack = function(){}; // person jack.prototype = new Person()から継承されます。 //プライベートメソッドの追加jack.prototype.say = function(){alert( "hello、my name is jack"); }; var j = new Jack(); J.SetName( "Jack"); j.say(); alert(j.getname());執筆の終わりに、最終的には、あなたが実際にあなたが行ったプロジェクトでこれの多くを使用していることに気付いたことはわかりません。とにかく、私はそれに遭遇しました、そして、これが閉鎖が存在する方法です。
それは決まり文句ですが、それでも非常に重要です。閉鎖の欠陥については、閉鎖を乱用していない場合は、メモリの漏れにつながると言ってください。 Baiduのメモリリークは何ですか?^_^。
JavaScript(必見)の閉鎖の上記の簡単な分析と解釈は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。