変数のように見え、多くの場合、変数のように動作しますがthis
、実際には変数ではないため、クロージャでは変数のように動作しません。ある関数が別の関数の中にネストされている場合、内側の関数は完全に新しいバージョンを取得this
し、外側の関数の と同じものを指す可能性はほとんどありませんthis
。
したがって、内部関数内の外部関数を参照する必要がある場合this
は、最初にそれを真の変数にコピーする必要があります (ほとんどの人はそれを呼び出すのが好きですself
が、一部の人は を好みthat
ます)。次に、内部関数でその変数を参照します。
ただし、あなたの場合、割り当て可能な実際の変数、つまり が既にあるので、コールバックで に置き換えるmemcached
だけです。これは、コールバックによって作成されたクロージャーの適切な範囲の外部変数です (その中で使用できるという事実からわかるように)。this
memcached
memcached.end()
[コメントに記載されているコードの正しい形式のバージョンを含めるように更新]
memcached.get = function get(key, callback) {
if (Array.isArray(key)) return this.getMulti.apply(this, arguments);
this.command(function getCommand (noreply) {
return { key: key , callback: callback ,
validate: [['key', String], ['callback', Function]] ,
type: 'get' , command: 'get ' + key };
});
};
複数の関数を非同期で呼び出そうとしているようでreturn
、それらからの値を期待しています。それは単にうまくいきません。