2 日前、私は Chrome 拡張機能を作成していました。コンテンツとバックグラウンド間の対話は、次のような非同期メソッドで実装する必要があるためです。
var Test = new Class({
options: {},
initialize: function(args) {
chrome.extension .sendRequest({ 'type ':'options' }, function(options) {
this.options = options;
...
});
これは Test オブジェクトであるはずですが、コールバック メソッドでは空です。これをパラメータとして渡してからコールバックする必要がありますか?幸いなことに、mootools にはバインドという優れたメソッドがあります。
var Test = new Class({
オプション: {},
初期化: function(args) {
chrome.extension.sendRequest({ 'type':'options' }, function(options) {
this.options = options;
… …
}.bind(this));
}
});
これでOKです:
var Test = new Class({
options: {},
初期化: function(args ) {
chrome.extension.sendRequest({ 'type':'options' }, function(options) {
this.options = options;
$each(this.options, function(o, i ) {
if (o == '1') {
this.fun1();
} else {
this.fun2(); >}.bind(this));
}.bind(this));
fun1: 関数 {},
fun2: 関数 {}
}); >
bind を使用しても、これがどれであるかを区別するのは簡単ではありません。実際のコードはこれよりもさらに恐ろしいものです。場合によっては、このクラスの代わりに他の変数を指すためにこれが必要になることがあります。
最も一般的に使用される解決策は次のとおりです:
コードをコピーします
chrome.extension.sendRequest({ 'type': 'オプション' }, function(options) {
_self.options = オプション;
$each(_self.options, function(o, i) {
if (o == '1') {
_self.fun1();
} else {
_self.fun2();
}
}); {},
fun2: function {}
});
これを置き換えるために _self 変数を特別に定義しました。これはどのようなものですか?パイソン!
今ようやく、Python の自己は決して不要ではないことに気づきました。