this


これは必要だ


オブジェクトの動作を表す方法は、そのオブジェクトが属するプロファイルを参照および変更できる必要があります.
  • 上記特性を解決するために提供される磁気参照変数
  • 自己参照変数=変数
  • 、所属するオブジェクトまたは作成するインスタンスを指します.

    関数呼び出しとバインド


    このバインディングは、関数が動的に決定する方法によって呼び出されます.

    一般関数の呼び出し

  • th=window(グローバルオブジェクトによってバインド)
  • の一般関数が呼び出されると、thisはすべてグローバルオブジェクト
  • にバインドされます.
    function foo(){
      console.log("foo's this: ", this); // window
      function bar(){
      	console.log("bar's this: ", this); //window
      }
      bar();
    }
    foo();
  • 問題
  • メソッドで定義されたオーバーラップ関数またはメソッドに渡されたコールバック関数が通常の関数として呼び出されると、グローバルオブジェクトをバインドする問題が発生します.
  • のような問題はヘルプ関数として機能しない
  • //해결책
    // this를 다른 변수에 할당하여 사용
    // 다른 방법으로는 Function.prototype 메서드인 apply, call, bind를 이용하여 간접적으로 this의 바인딩을 설정하는 방법이 있다 이는 뒤에서 설명
    var value = 1;
    
    const obj ={
     	value: 100,
      	foo() {
          const that = this;
          
          setTimeout(function(){
            console.log(that.value); //100
          },100);
        }
     }
    };
    obj.foo();
    

    メソッド呼び出し

  • メソッドの内部のこの点は、メソッドが所有するオブジェクトではなく、呼び出しメソッドのオブジェクトにバインドされます.
  • がこれらの特徴を示すのは、オブジェクトに定義されたメソッドPropertyが実際にはPropertyが関数オブジェクトを指すだけであるためである.
  • プロトタイプメソッドも
  • にバインド
    //이유 예제
    const person ={
     	name: 'lee';
      // getname 프로퍼티 -> return this.name 역할을 하는 함수 객체를 가리키고 있다(바인딩)
      	getNmae() {
    		return this.name;
        }
    	
    };
    console.log(person.getName()); //lee
    
    //작동 에제
    const anotherPerson ={
      name:'Kim';
    };
    
    anotherPerson.getName = person.getName;
    //메서드를 호출하는 객체 = anotherPerson
    console.log(anotherPerson.getName()); //Kim
    
    const getName = person.getName;
    //일반 함수로 호출  = window 전역 객체
    console.log(getName()); //''

    コンストラクタの呼び出し


    バインディング
  • ジェネレータ関数によって作成されたインスタンス
  • function Circle(radius){
    	this.radius = radius;
      	this.getDiameter = function (){
          return 2 * this.radius;
        };
    }
    
    const circle1 = new Circle(5);
    const circle2 = new Circle(10);
    
    console.log(circle1.getDiameter()); //10
    console.log(circle2.getDiameter()); //20
    

    Function.prototype. apply/call/bindメソッドによる間接呼び出し


    Function.prototypeのメソッドなので、すべての関数を継承して使用できます

    apply,callメソッド

  • は、第1の引数伝達を呼び出す特定のオブジェクトの関数をこの値にバインドする
  • の違いは、2回目の買収によって伝達された買収をリストしていることです.
    function getThisBinding(){
    	console.log(arguments);
        return this;
    }
    
    const thisArg = {a:1};
    // 두 번째 인수 전달 방식이 다르다
    console.log(getThisBinding.apply(thisArg, [1,2,3]));
    // Arguments(3) [1,2,3]
    // {a:1}
    console.log(getThisBinding.call(thisArg, 1,2,3))
    //Arguments(3) [1,2,3]
    //{a:1}
  • は、代表的な用途を有しています(配列で再表示されます).
  • Argumentsオブジェクトをアレイに変換する場合は
  • を使用します.
    function convertArgsToArray(){
      console.log(arguments);
      // call == apply
      // Array.prototype.slice를 인수 없이 호출하면 배열의 복사본을 생성
      const arr = Array.prototype.slice.call(arguments);
     
      console.log(arr);
      
      return arr;
      
    }
    convertArgsToArray(1,2,3); // [1,2,3]

    bind

  • applyは、callメソッドとは異なり、関数を呼び出すことなく、関数として使用するオブジェクト
  • のみを渡す.
    function getThisBinding(){
     	return this; 
    }
    
    const thisArg = {a:1};
    
    console.log(getThisBinding.bind(thisArg)); //getThisBinding
    console.log(getThisBinding.bind(thisArg)()); // {a:1} 명시적 호출
  • 用途
  • で上述した一般的な関数呼び出しの問題を解決するために使用される
  • ネスト関数およびコールバック関数が通常の関数として呼び出された場合、これをグローバルオブジェクトの問題
  • にバインドする.
    const person={
    	name: 'Lee',
        foo(callback){
          setTimeout(callback.bind(this), 100); 
        }
    };
    
    person.foo(function(){
      console.log(`Hi! my name is ${this.name}.`); // Hi! my name is Lee.
    });