[22章]this

5520 ワード

このキーワード
🥺 オブジェクトは,状態を表すプロセスと動作(挙動)を表す方法を1つの論理ユニットに組み合わせた複合材料構造である.
<最終クリーンアップ>
関数呼び出し方法が間違っているのは?
1.一般関数の呼び出し
2.呼び出し方法
3.コンストラクタの呼び出し
4. Function.prototype.apply/call/bindメソッドによる間接呼び出し
正解は?
全てが正解!
この要件
動作を表す方法は、その属するオブジェクトの状態、すなわちPropertyを参照して変更できる必要があります.
メソッドが属するオブジェクトのプロパティを参照する場合は、まずそのオブジェクトを指す識別子を参照する必要があります.
オブジェクトテキストで作成されたオブジェクトについては、メソッド自体が属するオブジェクトを指す識別子をメソッド内部で再帰的に参照できます.
const circle = {
	// 프로퍼티 : 객체 고유의 상태 데이터
    radius: 5,
    // 메서드: 상태 데이터를 참조하고 조작하는 동작
    getDiameter() {
    //이 메서드가 자신이 속한 객체의 프로퍼티나 다른 메서드를 참조하려면
    // 자신이 속한 객체인 circle을 참조할 수 있어야 한다.
    return 2 * circle.radius;
    }
   };
 console.log(circle.getDiameter()); //10
getDiameterメソッドでは、メソッドが属するオブジェクトを指す識別子ループが参照されます.
この参照式の評価ポイントは、getDiameterメソッドを呼び出して関数体を実行する時点です.
上記の例のオブジェクト文字は、ループ変数に割り当てる前に評価されます.
したがって、getDiameterメソッドを呼び出すと、オブジェクト文字の計算が完了し、オブジェクトが作成され、作成されたオブジェクトが円識別子で指定された後になります.
したがって、ループ識別子はメソッド内で参照できます.
しかし、自分の属するオブジェクトを再引用する方法は一面的ではなく、望ましくない.
関数を構築する方法でインスタンスを作成します.
function Circle(radius) {
	//이 시점에는 생성자 함수 자신이 생성할 인스턴스를 가리키는 식별자를 알 수 없다. 
    this.radius = radius; 
}
Circle.prototype.getDiameter = function () {
	// 이 시점에는 생성자 함수 자신이 생성할 인스턴스를 가리키는 식별자를 알 수 없다. 
    return 2 * this.radius;
};
//생성자 함수로 인스턴스를 생성하려면 먼저 생성자함수를 정의해야 한다.
const circle = new Circle(5);   
コンストラクション関数の内部では、作成するインスタンスを参照してPropertyまたはメソッドを追加する必要があります.
ただし、コンストラクション関数に基づいてオブジェクトを作成する方法では、コンストラクション関数を定義した後、new演算子とともにコンストラクション関数を呼び出す必要があります.
すなわち、コンストラクション関数でインスタンスを作成するには、まずコンストラクション関数が存在する必要があります.
コンストラクション関数を定義する時間がインスタンスの作成よりも早いため、コンストラクション関数が作成するインスタンスを指す識別子は決定できません.したがって、所属するオブジェクトまたは作成するインスタンスを指す特殊な識別子「this」が必要です.
これは、所属するオブジェクトまたは作成するインスタンスを指す自己参照変数です.これにより、オブジェクトまたは作成するインスタンスに属するプロシージャまたはメソッドを参照できます.
これはjsエンジンによって暗黙的に生成され、コードはどこでも参照できます.
関数を呼び出すとargumentsオブジェクトとそれは黙って関数の内部に渡されます.
関数内でargumentsオブジェクトを領域変数として使用できるように、領域変数としても使用できます.
しかし、thisが指す値、すなわちthisバインドは関数呼び出し方式によって動的に決定される.
this binding
バインドは、識別子と値を関連付けるプロセスを意味します.
このバインドは、this(キーワードに分類されますが、識別子として機能します)とthisが指すオブジェクトをバインドします.
また、変数宣言は、変数名(識別子)と確保されたメモリ領域アドレスをバインドします.
1)対象共通
const circle = {
	radius: 5,
    getDiameter() {
    	//this는 메서드를 호출한 객체를 가리킨다.
        return 2 * this.radius;
    }
};
console.log(circle.getDiameter()); 
2)コンストラクタ
//생성자 함수
function Circle(radius) {
	//this는 생성자 함수가 생성할 인스턴스를 가리킨다. 
    this.radius = radius;
}
Circle.prototype.getDimeter = function () {
	// this는 생성자 함수가 생성할 인스턴스를 가리킨다.
    return 2 * this.radius;
};
//인스턴스 생성
const circle = new Circle(5);
console.log(circle.getDiameter());
コンストラクション関数の内部にあるthisは、コンストラクション関数が作成するインスタンスを指します.
このように、thisは状況によって指す対象が異なります.
😇 Javaやc++などのクラスベースの言語では、thisは常にクラス生成のインスタンスを指します.ただし、javascriptのthisは、呼び出しに基づいてthisにバインドする値、すなわちthisバインドを動的に決定します.また、strict mode(厳密モード)もこのバインドに影響します.😇
これはコードのどこでも参考になります.グローバルでは、関数の内部参照もできます.
// this는 어디서든지 참조 가능하다.
// 전역에서 this는 전역 객체 window를 가리킨다.
console.log(this); // window 

function square(number) {
	//일반 함수 내부에서 this는 전역 객체 window를 가리킨다. 
    console.log(this) //window
    return number *number;
}
square(2); 
const person = {
	name: 'Lee',
    getName() {
    //메서드 내부에서 this는 메서드를 호출한 객체를 가리킨다
    console.log(this); // ||{name: "Lee", getName: f}||
    return this.name;
    }
};
console.log(person.getName());
 
function Person(name) {
	this.name = name;
    // 생성자 함수 내부에서 this는 생성자 함수가 생성할 인스턴스를 가리킨다. 
    console.log(this); // Person {name: "Lee"}
}
const me = new Person('Lee');
しかし、これはオブジェクトを参照するpropertyまたはメソッドの自己参照変数であり、通常はオブジェクトのメソッド内部またはコンストラクション関数内部にのみ意味があります.
従ってstrict modeを適用した一般的な関数の内部では,thisはundefinedをバインドした.
一般的な関数の内部ではthisを使用する必要はありません.
22.2関数の呼び出しとバインド
このバインド(この値にバインドされる)は、関数が呼び出される方法(すなわち、関数がどのように呼び出されるか)によって動的に決定されます.
렉시컬 스코프와 this 바인딩은 결정 시기가 다르다.
함수의 상위 스코프를 결정하는 방식인 렉시컬 스코프는 함수 정의가 평가되어 함수 객체가 생성되는 시점에 상위 스코프를 결정한다. 하지만 this 바인딩은 함수 호출 시점에 결정된다.
呼び出し
  • 関数
    1)一般関数の呼び出し(+コールバック関数を含むネスト関数)
    =>
    任意の関数が
  • を通常の関数として呼び出すと、グローバルオブジェクトがバインドされます.コールバック関数内のthisもグローバルオブジェクトをバインドします.
  • しかし、これは自己参照変数であり、オブジェクトを参照するためのPropertyまたはメソッドであり、オブジェクトを作成しない一般的な関数では意味がありません.
  • 厳格モードが適用された一般関数の内部でthis=未定義)
  • 2)呼び出し方法
    =>
  • メソッドでは、thisはメソッドを呼び出すオブジェクトです.
    メソッドを呼び出すと、メソッド名の前の句点になります.先に説明したオブジェクトをバインドします.
    なお、メソッドが属するオブジェクト
  • ではなく、メソッド内部のthisは呼び出しメソッドのオブジェクトにバインドされる
    Qメソッドはオブジェクトに含まれていますか?別々の相手ですか?
    答えを確かめる
    独立して存在する
    他のオブジェクトのメソッドでも、通常の変数に割り当てて、通常の関数として呼び出すこともできます.
    したがって,メソッド内部のthisはメソッドを指すオブジェクトとは無関係に,メソッドを呼び出すオブジェクトにバインドされる.
    3)コンストラクタの呼び出し
    =>
  • コンストラクタ内部のthisでは、コンストラクタが作成するインスタンスがバインドされます(将来).通常の関数と同じ方法でコンストラクション関数を定義し、new演算子とともに呼び出すと、コンストラクション関数として動作します.
  • new演算子とともにコンストラクション関数を呼び出さない場合は、コンストラクション関数ではなく通常の関数として使用されます.
  • 4) Function.prototype.apply/call/bindメソッドによる間接呼び出し
    =>
  • apply、call、bindメソッドはfunctionである.プロトタイプの方法.すなわち、これらの方法は、すべての関数によって継承されて使用することができる.
    applyとcallの本質的な機能は呼び出し関数である.
  • bind法は,メソッドthisがメソッド内部のネスト関数またはコールバック関数thisと一致しない問題を解決するために用いられる.
    // this 바인딩은 함수 호출 방식에 따라 동적으로 결정된다.
    const foo = function() {
    	console.dir(this);
    };
    // 동일한 함수도 다양한 방식으로 호출할 수 있다. 
    // 1. 일반 함수 호출
    // foo 함수를 일반적인 방식으로 호출 , foo함수 내부의 this는 전역 객체 window를 가리킨다
    foo(); //window