私はjavascriptクラスを持っており、各メソッドはQ
という約束を返します。私はなぜthis
がmethod2
とmethod3
に未定義であるか知りたいと思っています。このコードを書く正しい方法はありますか?約束を使っているときにクラスメソッドの中で 'this'が定義されていないのはなぜですか?
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
が必要な理由全くわからないが。 .then()
が殺しますthis
?
bind()を使用すると、paramsによって渡されるスコープとまったく同じ別の関数が作成されます。あなたの最後の質問に答えるだけですが、Mozilaのドキュメントをご覧ください:https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Function/bind –
ちょっとした[this](http://stackoverflow.com/questions/34930771/why-is-this-undefined-inside-class-method-when-using-promises)[that](http:// /image/gif/paws/97920/settimeout-and-this-in-javascript)? 私はまったく同じ質問を出しましたが、これは[that](http://stackoverflow.com/questions/591269/settimeout-and-this-in-javascript)で回答されませんでした。私は既に知っている(http://stackoverflow.com/questions/591269/settimeout-and-this-in-javascript)が、私は約束、ES6クラス、そして 'これ 'の用語に来ている。 – toszter
それは密接に関連していますが、これはこの質問の重複ではありません:http://stackoverflow.com/questions/591269/settimeout-and-this-in-javascriptまたは "なぜリンゴは木から落ちますか?" "なぜ私はテーブルを傾けたときにカードの家が崩壊するのですか?" – lex82