ホームページ  >  記事  >  ウェブフロントエンド  >  これについては javascript_javascript スキルで詳しく説明します

これについては javascript_javascript スキルで詳しく説明します

WBOY
WBOYオリジナル
2016-05-16 16:28:151256ブラウズ

このオブジェクトは常に 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();//賢いコーダー

わかりますか?

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。