javascriptの中でthisの説
2800 ワード
thisは、動作時の関数に基づいて環境バインディングを実行します.グローバル関数では、thisはwindowに等しく、関数があるオブジェクトの方法として呼び出されると、thisはそのオブジェクトに等しくなります.しかし、匿名関数の実行環境は大域的であるため、そのthisオブジェクトは通常windowを指すが、場合によってはクローズド方式が異なるため、この点はそれほど顕著ではないかもしれない.次の例を見ます.
getNameFun()は関数を返しますので、object.getNameFun()を呼び出してすぐに戻ります.結果として文字列を返します.しかし、この例で返される文字列は、グローバルname変数の値である「The Window」である.なぜ匿名関数は、スコープ(または外部スコープ)を含むthisオブジェクトを取得していないのですか?
各関数が呼び出された時、そのオブジェクトは自動的に二つの特殊変数を取得します.内部関数は、この2つの変数を検索すると、そのアクティブなオブジェクトだけが検索されます.これは外部関数の2つの変数に直接アクセスすることはできません.ただし、外部作用領域のthisオブジェクトを一つのクローズドパケットでアクセスできる変数に保存すると、クローズドがそのオブジェクトにアクセスできるようになります.
コードの中の顕著な行はこの例と前の例との違いを示している.匿名関数を定義する前に、thisオブジェクトの値をthatという変数に与えました.クローズドが定義された後、クローズドもこの変数にアクセスできます.これは私たちが関数を含む中で特に名声を得る変数です.関数が戻った後も、thatはobjectを引用して、すべての呼び出しがobject.get NameFun()()に戻ります. "
thisとargmentsも同じ問題があります.作用領域のアーグメンツオブジェクトにアクセスするには、オブジェクトの参照を別のクローズドパケットがアクセスできる変数に保存しなければなりません.
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も同じ問題があります.作用領域のアーグメンツオブジェクトにアクセスするには、オブジェクトの参照を別のクローズドパケットがアクセスできる変数に保存しなければなりません.