このオブジェクトは常にJSの落とし穴であり、それが何を指しているかを判断することは困難です。 C ++またはPythonからの経験により、この種の間違いをしばしば犯します。次に、このオブジェクトの所有権について詳しく説明しましょう。
ルール1:これはグローバル環境で
JavaScriptの環境は、機能によって本質的に決定されます。 JSでは、コンテキストをコードブロックで区切ることはできません。関数に包まれていない環境は、グローバル環境です。これは、グローバル環境でのグローバル変数ウィンドウを指しています。次の例を参照してください
コードコピーは次のとおりです。
var name = 'jjj';
console.log(this.name);
// JJJは正常に出力されます
ルール2:これはメソッドと呼ばれる場合
明らかに、この状況は判断しやすく、Pythonの自己と一致しています。これは間違いなくメソッドを呼び出すオブジェクトを指しています
コードコピーは次のとおりです。
var user = {
名前:「KKK」
};
user.getName = function(){
console.log(this.name);
};
user.getName();
//出力KKKは出力されます
ルール3:これは、コンストラクターとしての場合
この時点でこれについて多くを言う必要はありません。明らかに、新しく作成されたオブジェクトを指しています。コンストラクターの動作は実際にはオブジェクトを作成するのではなく、初期化だけです。オブジェクトは実行される前に作成されます。
ここにいくつかの例があります
コードコピーは次のとおりです。
function user(name){
this.name = name;
}
var f1 = new user( 'kkk');
var f2 = user( 'kkk');
console.log(f1.name); // kkk
console.log(f2.name); // undefinedには名前属性がありません
ルール4:この間接コール
いわゆる間接コールとは、適用と呼び出しへの呼び出し関数を使用することを指し、これはパラメーターリストの最初のパラメーターを指します。
コードコピーは次のとおりです。
var setName = function(name){
this.name = name;
};
var user = {レベル:2};
user.apply(setname、 'jjj');
console.log(user.name); // jjj
ルール5:これは他の場合です
これは他の状況では変更されないことを忘れないでください。これは間違いを犯す最も簡単な場所でもあります。
コードコピーは次のとおりです。
var name = "clever Coder";
var person = {
名前:「Foocoder」、
こんにちは:function(sth){
var sayshello = function(sth){
console.log(this.name + "say" + sth);
};
Sayhello(STH);
}
}
person.hello( "Hello World"); //賢いコーダーはHello Worldを言います
上記のコードは奇妙に見えますが、これが人にポイントするべきではありませんか?
ネストされた関数のこれは、ネストする関数を指していないことを覚えておく必要があります。この例では、これはSayShelloでは、Helloに対応する関数を指しません。例をわずかに変更した場合
コードコピーは次のとおりです。
こんにちは:function(sth){
console.log(this.name + "say" + sth);
}
// FoocoderはHello Worldと言います
誰もが、この時点で、Sayhelloが方法として呼び出していないことを理解すべきだったので、これはグローバルオブジェクトを指し示しています。 。 。
この時点で、問題は、ノードを使用して実行する最初の例が、未定義の「Hello World」と表示されることです。それを説明するマスターがいるのだろうか。
ルール6:評価はすべてのルールを破ります
最後に、例で終わります
コードコピーは次のとおりです。
var name = "clever Coder";
var user = {
名前:「KKK」
};
user.getName = function(){
console.log(this.name);
};
var get = user.getName;
get(); //賢いコーダー
わかりますか?