私の未亡人のダニ:JavaScriptで
23234 ワード
“Truly I tell you, this poor widow has put more into the treasury than all the others.
They all gave out of their wealth; but she, out of her poverty, put in everything— all she had to live on.”Mark 12: 43-44
警告は、これは最もNA - AVEのVEのアプローチですが、最後に、私はより良い理解するためには、このキーワードを理解する場合でも、それは最も理解しにくい理解してください.
私はこれを直接情熱的に書いています.なぜなら、私はこのキーワードを文脈と参照に付属している混乱を直接目撃したからです.
この単語自体は、何かを示すために使用される実証代名詞です.あなたが最初に代名詞の概念を把握する必要がありますどのように日常的に完全な馬鹿のように見えるからあなたを救うために😁.
リチャードはリチャードのために夜を通して読んだので、この例を考えてください.
正気の人として代名詞の概念を実装すると、我々は書く:リチャードは、彼はすべての夜を読むので、テストで最高得点.
我々がリチャードを再利用しなかったことに注意してください、我々は人々が我々から逃げることを望まないので、我々はこうします.私を信じて、それ以外の場合はガールフレンドのようなかわいいモデルの着陸の彼のチャンスに別れを告げる必要があります任意の男🤦♂️.
したがって、JavaScriptとプログラミング一般に、したがって、レファレンスの必要です.これは基本的には実行コードの文脈で対象となるオブジェクト(前件)を指します.
以下に詳細について説明します.
let person = {
name: 'Richard Doe',
job: 'Farming',
jobFunction: function () {
console.log(`${this.name}'s occupation is ${this.job}`);
},
};
person.jobFunction(); //Richard Doe's occupation is Farming
// But of course this would also work
let person = {
name: 'Richard Doe',
job: 'Farming',
jobFunction: function () {
console.log(`${person.name}'s occupation is ${person.job}`);
},
};
person.jobFunction(); //Richard Doe's occupation is Farming
私たちのコードは、それを人として第二の方法で書くことを過剰になります.名前と人.仕事、確かにターンオフ🤮. 特に、私たちが意識していないかもしれないもう一つの世界的な変数の人がいるかもしれないので、これは我々のコードでエラーをデバッグするのが難しくなるかもしれません.それで、我々は曖昧さを避けるために、このキーワードを使用して、正確さを強調します.オブジェクトのように、すべてのJavaScript関数はプロパティを持っています.そして、実行するとき、彼らは、このプロパティを使用している関数を呼び出すオブジェクトの値を持つ変数を変数とします.
When in strict mode, "this" holds the value of undefined in the global scope and anonymous in functions that aren't bound to any object.
ゴチャ
すべての混乱を解消するには、この1つの原則を理解することが重要ですオブジェクトがこれが定義される関数を呼び出すまで、これは値を割り当てられません.
ほとんどの場合、これはそれを呼び出すオブジェクトの値を仮定します.このオブジェクトがインボイスオブジェクトの値を持っていない場合、インスタンスやシナリオはほとんどありません.
グローバルスコープ
これはあまりにも長いええとなっている?ちょうどいくつかの点と1つのより多くのセクションと我々は行われている🙏.
グローバルスコープでは、すべてのグローバル変数と関数がウィンドウオブジェクトで定義されます.したがって、グローバルスコープでは、グローバルウィンドウオブジェクト(厳密モードを除く)の値を持ちます.
// in the global scope
function print() {
this.color = 'purple';
console.log(this.color);
}
print(); //purple
厳密モードでは function print() {
'use strict';
this.color = 'purple';
console.log(this.color);
}
print();//Cannot set property 'color' of undefined
ここでは、トリッキーな部分は、今私はいくつかのシナリオでは、このキーワードは混乱になるに触れることになる.以下に例を示します.
// here is an object with a clickhandler method that is called when a button is clicked
var person = {
farmers: [{ name: 'Richard Doe', job: 'Farmer' }],
clickHandler: function () {
console.log(`${this.farmers[0].name} is a ${this.farmers[0].job}`);
},
};
let button = document.getElementById('button'); //button here is an object
button.addEventListener('click', person.clickHandler); //the click() method here is a method on the button object and
// Cannot read property '0' of undefined because there is no farmers property on the button object
これはボタンがオブジェクトであるので、これは未定義です.ClickHandler ()は、ButtonのClickメソッドをコールバックとして渡すメソッドです.これは人を意味する.ClickHandler ()は、Personオブジェクトを参照しません.ここでは、ここでは、オブジェクトを参照してください.ClickHandler ()メソッドは、ボタンオブジェクトです.したがって、文脈が変わるとき、このキーワードがこれが当初定義されていたオブジェクトを参照するのではなく、これが定義されたメソッドを呼び出すオブジェクトにもはや言及しないことは明快です.
この問題を解決する方法は、bindメソッドを使用することです.ClickHandler ()メソッドをPersonオブジェクトにバインドします.
以下に例を示します.
// An alternative approach
var person = {
farmers: [{ name: 'Richard Doe', job: 'Farmer' }],
clickHandler: function () {
console.log(`${this.farmers[0].name} is a ${this.farmers[0].job}`);
},
};
let button = document.getElementById('button'); //button here is an object
button.addEventListener('click', person.clickHandler.bind(person)); //the click() method here is a method on the button object and
//Richard Doe is a Farmer
これが閉鎖の内部で使われるとき、クロージャは基本的に内部関数であり、この変数を関数自体でのみアクセスできるため、このキーワードを使用してクロージャが外部関数のこの変数にアクセスできないことを認識します.
これを見てください.
var person = {
farmersMotto: 'Farming is our pride',
farmers: [
{ name: 'Richard Doe', job: 'Farmer' },
{ name: 'Rachael Doe', job: 'Farmer' },
],
clickHandler: function () {
this.farmers.forEach(function () {
console.log(`Our motto as farmers is ${this.farmersMotto}`); //Our motto as farmers is undefined
//why?
console.log('' + this); // [object window]
});
},
};
person.clickHandler();
匿名関数の内部は、グローバル関数オブジェクトにバインドされます.なぜなら、厳密なモードが使用されていない場合、外部関数のアクセスにはアクセスできないからですこれを解決するのは非常に簡単です.ただ、この関数を匿名関数を入力する前に変数に設定します.これは、開発者の間でかなり人気のあるアプローチです.
これを見てください.
var person = {
farmersMotto: 'Farming is our pride',
farmers: [
{ name: 'Richard Doe', job: 'Farmer' },
{ name: 'Rachael Doe', job: 'Farmer' },
],
clickHandler: function () {
var thisPerson = this;
this.farmers.forEach(function () {
console.log(`Our motto as farmers is: ${thisPerson.farmersMotto}`); //Our motto as farmers is: Farming is our pride
});
},
};
person.clickHandler();
メソッドが変数
以下に例を示します.
// This data variable is a global variable
var farmers = [{ name: 'Rachael Doe', job: 'Farming' }];
var person = {
// this data variable is a property on the Person object
farmers: [{ name: 'Richard Doe', job: 'Farming' }],
showData: function (event) {
console.log(`${this.farmers[0].name}'s job is ${this.farmers[0].job}`);
},
};
// Assign the person.showData to a variable
var showPersonsData = person.showData;
//
showPersonsData(); // Rachael Doe's job is Farming (from the global data array)
//The output we desire is: Richard Doe's job is Farming.
//so how do we fix this?
これを迅速に修正するには、bindメソッドを使用します.このように:
// This data variable is a global variable
var farmers = [{ name: 'Rachael Doe', job: 'Farming' }];
var person = {
// this data variable is a property on the Person object
farmers: [{ name: 'Richard Doe', job: 'Farming' }],
showData: function (event) {
console.log(`${this.farmers[0].name}'s job is ${this.farmers[0].job}`);
},
};
// Assign the person.showData to a variable
var showPersonsData = person.showData.bind(person);
//
showPersonsData(); // Richard Doe's job is Farming (from the global data array)
もちろん、このキーワードエラーと修正のJavaScriptの他のケースがあります.私はこのキーワードの詳細な理解のためにthis articleを読むことをお勧めします.ファイナルノート
私は経験が浅いです、しかし、私は私が私が知っている少しであなたを援助することができたことを望みます.Lemmeはあなたが何を考えるか知っている👋.
In everything I did, I showed you that by this kind of hard work we must help the weak, remembering the words the Lord Jesus himself said: ‘It is more blessed to give than to receive.
Act 20:35
Reference
この問題について(私の未亡人のダニ:JavaScriptで), 我々は、より多くの情報をここで見つけました https://dev.to/agboola_iyanu/my-widow-s-mite-the-this-keyword-in-javascript-1n86テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol