programing

약속을 사용할 때 내부수업 방식이 정의되지 않은 이유는 무엇입니까?

javajsp 2023. 10. 26. 20:45

약속을 사용할 때 내부수업 방식이 정의되지 않은 이유는 무엇입니까?

자바스크립트 클래스가 있는데, 각각의 메소드는 a를 반환합니다.Q약속.난 이유를 알고 싶다.this정의되지 않음method2그리고.method3. 이 코드를 쓰는 더 정확한 방법이 있습니까?

function MyClass(opts){
  this.options = opts;

  return this.method1()
    .then(this.method2)
    .then(this.method3);
}

MyClass.prototype.method1 = function(){
  // ...q stuff...

  console.log(this.options); // logs "opts" object

  return deferred.promise;
};

MyClass.prototype.method2 = function(method1resolve){
  // ...q stuff...

  console.log(this); // logs undefined

  return deferred.promise;
};

MyClass.prototype.method3 = function(method2resolve){
  // ...q stuff...

  console.log(this); // logs undefined

  return deferred.promise;
};

사용해서 고칠 수 있습니다.bind:

function MyClass(opts){
  this.options = opts;

  return this.method1()
    .then(this.method2.bind(this))
    .then(this.method3.bind(this));
}

하지만 그 이유를 완전히 확신할 수는 없습니다.bind필요하다; is.then()살생의this꺼졌다고요?

this는 항상 메서드가 호출되는 개체입니다.그러나 방법을 전달할 때then(), 당신은 그것을 부르는 것이 아닙니다!메소드는 어딘가에 저장되고 나중에 거기서 호출됩니다.보존하고 싶다면this, 다음과 같이 해야 합니다.

.then(() => this.method2())

또는 ES6 이전 방식으로 해야 하는 경우 보존해야 합니다.this이전:

var that = this;
// ...
.then(function() { that.method2() })

약속 처리기는 글로벌 개체의 컨텍스트에서 호출됩니다(window) 기본값입니다.엄밀 모드일 때(use strict;), 문맥은undefined. 이런 일이 발생하고 있는 겁니다method2그리고.method3.

;(function(){
  'use strict'
  Promise.resolve('foo').then(function(){console.log(this)}); // undefined
}());

;(function(){
  Promise.resolve('foo').then(function(){console.log(this)}); // window
}());

위해서method1, 전화하시는군요method1~하듯이this.method1(). 이런 식으로 부르는 것은 그것을 그것의 맥락에서 부르는 것입니다.this당신의 인스턴스인 object.그래서 그 안의 맥락이method1예입니다.

기본적으로, 당신은 그것을 문맥 참조 없이 함수 참조로 전달하고 있습니다.this컨텍스트는 몇 가지 방법으로 결정됩니다.

  1. 은연중에.글로벌 함수 또는 바인딩이 없는 함수를 호출하는 것은 글로벌 컨텍스트를 가정합니다.*
  2. 직접적인 참조로.전화하면myObj.f()그리고나서myObj가 될 것입니다.thiscontext.**
  3. 수동 바인딩.이것은 다음과 같은 당신의 함수 클래스입니다..bind그리고..apply. 이것들은 당신이 명시적으로 말하는 것입니다.this맥락은.이는 항상 이전 두 가지보다 우선합니다.

예제에서는 함수 참조를 통과하고 있으므로 호출 시 전역 함수 또는 컨텍스트가 없는 함수로 암시됩니다.사용..bind를 사용하여 이 문제를 해결합니다.this가 명시적으로 설정되어 있습니다.

*이는 엄격하지 않은 모드에서만 해당됩니다.엄밀한 모드에서,this로 설정됩니다.undefined.

**사용 중인 기능이 수동으로 바인딩되지 않았다고 가정합니다.

단방향 함수가 컨텍스트를 얻습니다(this를 호출하는 개체에서 가져온 것입니다(이 때문에).method1적절한 맥락을 가지고 있습니다 - 그것은 실행됩니다.this함수 자체에 대한 참조를 에 전달하고 있습니다.then. 당신은 다음과 같은 구현을 상상할 수 있을 것입니다.then다음과 같이 보입니다.

function then( callback ) {

  // assume 'value' is the recently-fulfilled promise value
  callback(value);
}

그 예에서callback는 기능에 대한 참조입니다.어떤 맥락도 없습니다.이미 언급했듯이 함수를 전달하기 전에 컨텍스트에 바인딩하면 이 문제를 해결할 수 있습니다.

언급URL : https://stackoverflow.com/questions/34930771/why-is-this-undefined-inside-class-method-when-using-promises