javascriptの中でthisの説

2800 ワード

thisは、動作時の関数に基づいて環境バインディングを実行します.グローバル関数では、thisはwindowに等しく、関数があるオブジェクトの方法として呼び出されると、thisはそのオブジェクトに等しくなります.しかし、匿名関数の実行環境は大域的であるため、そのthisオブジェクトは通常windowを指すが、場合によってはクローズド方式が異なるため、この点はそれほど顕著ではないかもしれない.次の例を見ます.
var name="The Window";

var object={

      name : " My Object";

      getNameFunc : function()

                              {

                                        return function()

                                          {

                                               return this.name;

                                          }

                              }

    

} 
alert(object.getNameFunc()()); //"The Window"
widow.document.body.onclick=object.getNameFunc() //"The Window"
以上のコードはまずグローバル変数nameを作成し、name属性を含むオブジェクトを作成しました.このオブジェクトはまた、匿名関数に戻り、匿名関数がthis.nameに戻る方法、get NameFun()を含む.
getNameFun()は関数を返しますので、object.getNameFun()を呼び出してすぐに戻ります.結果として文字列を返します.しかし、この例で返される文字列は、グローバルname変数の値である「The Window」である.なぜ匿名関数は、スコープ(または外部スコープ)を含むthisオブジェクトを取得していないのですか?
     各関数が呼び出された時、そのオブジェクトは自動的に二つの特殊変数を取得します.内部関数は、この2つの変数を検索すると、そのアクティブなオブジェクトだけが検索されます.これは外部関数の2つの変数に直接アクセスすることはできません.ただし、外部作用領域のthisオブジェクトを一つのクローズドパケットでアクセスできる変数に保存すると、クローズドがそのオブジェクトにアクセスできるようになります.
var object={

      name : " My Object";

      getNameFunc : function()

                              {

                                       var that=this;

                                        return function()

                                          {

                                            return that.name;

                                          }

                              }

    

} 

alert(object.getNameFunc()());   //"My Object"
widow.document.body.onclick=
object.getNameFunc() //"My Object"
 
コードの中の顕著な行はこの例と前の例との違いを示している.匿名関数を定義する前に、thisオブジェクトの値をthatという変数に与えました.クローズドが定義された後、クローズドもこの変数にアクセスできます.これは私たちが関数を含む中で特に名声を得る変数です.関数が戻った後も、thatはobjectを引用して、すべての呼び出しがobject.get NameFun()()に戻ります. "
    thisとargmentsも同じ問題があります.作用領域のアーグメンツオブジェクトにアクセスするには、オブジェクトの参照を別のクローズドパケットがアクセスできる変数に保存しなければなりません.