簡単にjs閉包について話します

2467 ワード

js閉包、阮先生は「閉包は他の関数の内部変数を読み取ることができる関数だ.Javascript言語では,関数内部のサブ関数のみが局所変数を読み取ることができるため,閉パケットを「1つの関数内部に定義された関数」と簡単に理解できる.したがって,本質的には,閉パケットは関数内部と関数外部をつなぐ橋渡しである.ここではまずグローバル変数とローカル変数を理解するかもしれませんが、ここではあまり説明しません.次にいくつかの例を通して、比較パッケージの理解や様々な閉パッケージの書き方についてお話しします.以下の例は専門的ではないかもしれませんが、閉パッケージの理解には個人的に大きな助けがあると思います.例1:
function a(){
   var b = 1;
   return function c(){
       console.log(b)
   }
}
a()();  //1

この関数呼び出し時,a()は,2つの括弧を有し,1つ目はa関数呼び出し,2つ目はc関数実行である.a()を単独で実行する場合.戻ってくるのはc関数の関数体で、ここでc関数をキャッシュして、すぐに実行していません!例2:
function a(){
    return function(){
        console.log(0)
    }
}
a()(); //0

この書き方は、上記の書き方とあまり差はありませんが、キャッシュするときは匿名関数ですが、呼び出す方法は同じです!例3:
 function a() {    
    var b = 1;    
    function c() {      
        alert(b);    
    }    
    return c;  
}  
var d = a();  
d(); // 1

例3を分析すると、c関数は閉パッケージの形式であり、1つの関数には別の関数がネストされており、ネストされた関数はキャッシュされている.つまりc関数であるが、ここでの書き方は少し異なり、var d=a()である. d();a()に等しい.ここではキャッシュを1回行っただけで、これで分かりやすいです.また、このコードには2つの特徴があります.1、関数cが関数aの内部にネストされています.2、関数aは、関数cを返す.例4:
var name = "The Window";  
    var object = {    
        name: "My Object",
        getNameFunc: function() {
            return function() {      
                return this.name;      
            };    
        }  
    };  
 alert(object.getNameFunc()());  //The Window

説明すると、実はこれは簡単で、getNameFunc()が初めて実行したときに、中にthisを印刷すると、このthisはobjectを指してfunction(){return this.name;};を返します.getName Func()()が実行されると、function(){return this.name}が実行されます.このような一言で、ここのthisはwindowを指しているので、最後の結果はThe Windowです.例5:
var name = "The Window";
  var object = {
    name : "My Object",
    getNameFunc : function(){
      var that = this;
      return function(){
        return that.name;
      };
    }
  };
  alert(object.getNameFunc()()); //My Object

この例では、上記と比較してvar that = this;が多くなり、戻ってきたのはthat.name;です.上記の説明を参照すると、var that=thisのため、thatが返されることが明らかになります.name、thisの指向を変えて、thatはobjectを指して、だから最後の結果はMy Objectです;クローズドパッケージの使用上の注意点:1)クローズドパッケージを使用すると、関数の変数がメモリに保存され、メモリ消費量が大きいため、クローズドパッケージを乱用することはできません.そうしないと、ウェブページの性能に問題が発生し、IEでメモリが漏れる可能性があります.解決策は、関数を終了する前に、使用しないローカル変数をすべて削除することです.2)閉パッケージは親関数の外部で、親関数の内部変数の値を変更します.したがって、親関数をオブジェクト(object)として使用し、閉パッケージを共通のメソッド(Public Method)とし、内部変数をプライベート属性(private value)として使用する場合は、親関数の内部変数の値を勝手に変更しないように注意してください.これらを理解すれば、私はかばんを閉じても十分も離れないと思います.