javascriptのthis使用シーンと矢印関数のthis
3327 ワード
jsに接触したばかりの頃は、thisに対していつもこの上なく困惑していました.以下はjsデザインモードと実践からの総括です.
thisは常に一つのオブジェクトを指し、グローバルオブジェクトを指す場合もあり、構造オブジェクトを指す場合もあり、DOMオブジェクトを指す場合もあります.
1.オブジェクトとしてのメソッド呼び出し
オブジェクトとしてのメソッド呼び出し時
一般関数のthisは常にグローバル変数を指します.
DOMイベントトリガー関数の中のthisはDOMノード自身を指します.
4.コンストラクタの呼び出し
new演算子を使ってコンストラクタを呼び出すと、オブジェクトが返されます.コンストラクタのthisは、一般的に返したオブジェクトを指します.コンストラクタがreturn明示式を使ってオブジェクトを返すと、newオペレータが返したのは、明示的に返されたオブジェクトです.
callまたはappy呼び出しにより、thisの着信先が変更されます.
矢印関数のthisは、定義時にあるthisで、矢印関数自体にthisがないということです.矢印関数は、bind、call、applayを使って、thisの指向を変えることもできます.
end
thisは常に一つのオブジェクトを指し、グローバルオブジェクトを指す場合もあり、構造オブジェクトを指す場合もあり、DOMオブジェクトを指す場合もあります.
1.オブジェクトとしてのメソッド呼び出し
オブジェクトとしてのメソッド呼び出し時
this
は、オブジェクトの本生を指します.var Person = {
name: 'bingxl',
getName: function () {
console.log(this.name); //bingxl
}
};
Person.getName();
2.一般関数として呼び出される一般関数のthisは常にグローバル変数を指します.
var name = 'window';
function getName() {
var name = 'function';
return this.name;
}
console.log( getName()); //window undefined
オブジェクトのメソッドを変数にコピーし、変数によって呼び出した後のオブジェクトのメソッドは、通常の関数になります.var name = 'window';
var Person = {
name: 'bingxl',
getName: function () {
return this.name;
}
};
var getName1 = Person.getName;
console.log(getName1()); // window
var getName2 = Person.getName();
console.log(getName2); // bingxl
この例を見ると、get Name 1=Person.getNameは、getName 1をPerson.getName方法のメモリアドレスに向けるものであり、その本質は関数であるため、get Name 1()を使用する場合は、一般関数getName 2=Person.getName()を呼び出し、Person.getName()の値を返します.BingxlはgetName 2に値を割り当て、2つの変数は行typeofで操作されます.console.log(typeof getName1); //function
console.log(typeof getName2);// string
3.DOMイベントトリガ関数のthisDOMイベントトリガー関数の中のthisはDOMノード自身を指します.
click this
window.id = 'window';
var div = document.getElementById('person');
div.addEventListener('click', function () {
console.log(this.id); //person
var test = function () {
console.log(this.id); // window
};
test();
});
test()は普通の関数ですので、testのthisは全体のオブジェクトwindowを指します.4.コンストラクタの呼び出し
new演算子を使ってコンストラクタを呼び出すと、オブジェクトが返されます.コンストラクタのthisは、一般的に返したオブジェクトを指します.コンストラクタがreturn明示式を使ってオブジェクトを返すと、newオペレータが返したのは、明示的に返されたオブジェクトです.
var Person = function () {
this.name = 'bingxl';
};
var student = new Person();
console.log(student.name); // bingxl
var Person = function () {
this.name = 'bingxl';
return {
name: 'test'
};
};
var student = new Person();
console.log(student.name); // test
5.call、appyとbindcallまたはappy呼び出しにより、thisの着信先が変更されます.
var Doctor = {
name: 'bingxl',
profession: 'doctor',
getProfession: function () {
console.log(this.profession);
}
};
var Student = {
name: 'zhangsan',
profession: 'student'
};
Doctor.getProfession(); // doctor
Doctor.getProfession.call(Student); //student
6.矢印関数のthis矢印関数のthisは、定義時にあるthisで、矢印関数自体にthisがないということです.矢印関数は、bind、call、applayを使って、thisの指向を変えることもできます.
var env = 'window'
function Test() {
this.env = 'test function';
console.log('in Test Object', this.env); // test function
let arrow = () => {
console.log('in arrow function', this.env); // test function
};
arrow();
sub();
function sub( ) {
console.log('in sub ', this.env); // window, this
}
}
const test = new Test();
アロwとsub関数を比較するとわかる.end