このオブジェクトは常に js の罠であり、それが何を指しているのかを判断するのは難しく、C や Python での self の経験により、この種の間違いをよく犯します。次に、このオブジェクトの所有権について詳しく説明します。
ルール1:地球環境のこれ
JavaScript の環境は本質的に関数によって決まります。JS では、関数によってラップされていない環境はグローバル変数ウィンドウを指します。以下の例。
var name='jjj';
console.log(this.name);
// jjj
が正常に出力されます
ルール 2: メソッドとして呼び出された場合の this
明らかに、この状況は Python の self と一致しており、メソッド
を呼び出しています。
var user={
名前:'kkk'
};
user.getName=function(){
console.log(this.name);
};
user.getName();
// kkk
を出力します
ルール 3: コンストラクターとして使用される場合の this
言うまでもなく、この時点では、コンストラクターの実行は実際にオブジェクトを作成するのではなく、
を実行する前に作成されたオブジェクトを初期化するだけです。
以下にいくつかの例を示します
関数 ユーザー(名前){
This.name=name;
}
var f1=新しいユーザー('kkk');
var f2=ユーザー('kkk');
console.log(f1.name);//kkk
console.log(f2.name);//未定義には名前属性がありません
ルール 4: これは間接呼び出しです
いわゆる間接呼び出しは、apply と call を使用して関数を呼び出すことを指します。このとき、これはパラメーター リストの最初のパラメーターを指します。
var setName=関数(名前){
This.name=name;
};
var user={レベル:2};
user.apply(setName,'jjj');
console.log(user.name);//jjj
ルール 5: 他の状況でもこれが適用されます
これは他のケースでは変更されないことに注意してください。これは間違いが最も起こりやすい場所でもあります。
var name = "賢いコーダー";
var person = {
名前: "フーコーダー"、
こんにちは: function(sth){
var Sayhello = function(sth) {
console.log(this.name " は " sth);
};
sayhello(sth);
}
}
person.hello("hello world");//賢いプログラマーは hello world と言います
上記のコードは奇妙に見えますが、これは人を指しているはずではありませんか?
この例では、ネストされた関数の this は、ネストされている関数を指すわけではなく、sayhello に対応する関数を指すわけではないことに注意してください。例を少し変更して
とすると
hello:function(sth){
console.log(this.name " は " sth);
}
// フードコーダは hello world と言う
現時点では、sayhello はメソッドとして呼び出されておらず、これがグローバル オブジェクトを指していることは誰もが理解しているはずです。 。 。
この時点で問題が発生します。ノードを使用して最初の例を実行すると、未定義のsays hello worldが表示されます。誰か説明してください。
rule6:eval はすべてのルールを破ります
最後に例を挙げて終わります
コードをコピー コードは次のとおりです:
var name = "賢いコーダー";
var user={
名前:'kkk'
};
user.getName=function(){
console.log(this.name);
};
var get=user.getName;
get();//賢いコーダー
わかりますか?