1 つの文を覚えておく必要があります。これは常に、関数が実行されているオブジェクトを指します。関数が作成されたオブジェクトではなく。覚えておいてください...
この記事では、このオブジェクトが 3 つの状況でどこにあるかを分析します。
これは通常の関数でのことです
これがどこにあっても、最優先事項は、関数の実行中にその位置を見つけることです。
1 var name="global";
2 function getName(){
3 var name="local";
4 return this.name;
5 };
6 alter(getName());
これがグローバル環境の関数 getName に出現する場合、関数 getName の実行時位置は
alert(getName());
明らかに、関数 getName が配置されているオブジェクトはグローバル オブジェクトです。窓なので、これのホームは窓にあるはずです。このとき、this は window オブジェクトを指しているため、getName によって返される this.name は実際には window.name であるため、アラートは「グローバル」として出力されます。
では、これが地球環境の働きではなく局所環境の働きで現れる場合、どこに該当するのでしょうか?
1 var name="global";
2 var twobin={
3 name:"local",
4 getName:function(){
5 return this.name;
6 }
7 };
8alert(twobin.getName());
これが配置されている関数 getName はグローバル環境ではなく、twobin 環境にあります。これがどこにあっても、関数の実行中にその場所を見つける必要があります。このとき、関数 getName の実行時の位置
alert(twobin. getName());
明らかに、関数 getName が配置されているオブジェクトは twobin なので、このホームは twobin にある必要があります。つまり、 twobin オブジェクトに追加した場合、getName によって返される this.name は実際には twobin 名であるため、アラートは「部分的」として出力されます。
これはクロージャです
クロージャは厄介な問題でもあります。この記事では、当面はこれについて詳しく説明しません。つまり、いわゆるクロージャとは、関数の中に別の関数を作成することです。外部変数にアクセスします。
放蕩息子、これには悪党の閉鎖が混ざっていて、決して平和が存在しないのは明らかです!
1 var name="global";
2 var twobin={
3 name:"local",
4 getName:function(){
5 return function(){
6 return this.name;
7 } ;
8 }
9 };
10 alter(twobin.getName()());
現時点では、これは明らかに問題があり、実際にも問題が発生していますgetName 関数内の匿名 関数内で、匿名関数は変数名を呼び出し、クロージャを形成します。つまり、this はクロージャ内にあります。
これがどこであっても、関数の実行中に必ずその場所を見つけてください。このとき、関数getNameの実行時位置では判断できず、無名関数の実行時位置で判断します。
function (){
return this .name;
};
明らかに、匿名関数が配置されているオブジェクトは window であるため、this のホームは window である必要があり、その場合、匿名関数によって返される this.name は次のようになります。実はwindow.nameなので注意 出てくるのは「全体像」です!
では、これをクロージャの twobin でどのように作成するのでしょうか?
var name="global";
var twobin={
name:"local",
getName:function(){
var that=this;
return function(){
この時点で、getName 関数の実行時の位置は
alert(twobin.getName()); です。 🎜> これは twobin を指しますオブジェクトなので、これも twobin オブジェクトを指します。 that.name がクロージャの匿名関数で返される場合、このときに返される that.name は実際には twobin.name であるため、「ローカル」に警告を与えることができます。
This in call and apply
JavaScript でこれを制御できるのは call と apply だけです。
電話して応募してください。彼らはこの子を住まわせた場所ならどこにでも住むことになるので、従わなければなりません。
コードをコピーします
コードは次のとおりです:
}
getName(twobin);
getName .call(twobin);
ここで、これは関数 getName 内にあります。これがどこにあっても、関数の実行中にその場所を見つける必要があります。このとき、関数 getName の実行時の位置は
getName(twobin);
当然、関数 getName が配置されているオブジェクトは window なので、このホームは window 内にある必要があります。つまり、ウィンドウ オブジェクトを指すと、getName はこれを返します。その名前は実際には window.name であるため、アラートは「グローバル」として出力されます。
それでは、電話して応募する番です。なぜなら、これは彼らの命令を聞かなければならないからです!
getName.call(twobin);
このうち、call は this のホームが twobin オブジェクトであることを指定します。これは強制的に twobin にのみ解決されるため、この時点では this は twobin オブジェクトを指します。 this.name 実際には twobin.name なので、アラートは「部分的」として表示されます。
少しまとめ
これは放蕩です: 関数が作成されたオブジェクトではなく、関数が実行されているオブジェクトを常に指します。それが匿名関数内にあるか、オブジェクト内にない場合、this は次を指します。 window オブジェクト。call または apply の場合、どのオブジェクトを指定するかは、そのオブジェクトを指します。