私はこのようなことをしたいと思います:
function end(){ console.log(this); } // <-- the problem is here with `this`
eval('var a = 0; setTimeout(function(){ a = 10; end(); }, 2000)');
2秒後に出力されるはずです:
{ "a" : 10 }
これはどういうわけか可能ですか?
私はこのようなことをしたいと思います:
function end(){ console.log(this); } // <-- the problem is here with `this`
eval('var a = 0; setTimeout(function(){ a = 10; end(); }, 2000)');
2秒後に出力されるはずです:
{ "a" : 10 }
これはどういうわけか可能ですか?
はい:
function end(){ console.log(this); }
eval('var a = 0, self = this; setTimeout(function(){ a = 10; end.call(self); }, 2000)');
変数 を に設定し、を呼び出すときに使用するself
ことに注意してください。これにより、呼び出し中に に特定の値を設定できます。これが機能するのは、渡された無名関数が、それが作成された実行コンテキストとその中のすべての変数への参照を持ち、(and ) にアクセスできるためです。this
Function#call
end
this
setTimeout
self
a
使用する本当に正当な理由がない場合eval
(そして、ここには表示されません)、私はそうしません。これを行うだけです。
function end(){ console.log(this); }
var a = 0, self = this; setTimeout(function(){ a = 10; end.call(self); }, 2000);
end
呼び出されたときに向きを変えて正しいthis
値で呼び出す 2 番目の関数を作成することもできます。これはバインディングと呼ばれ、ES5Function#bind
関数によって容易になります。
function end(){ console.log(this); }
var a = 0, boundEnd = end.bind(this); setTimeout(function(){ a = 10; boundEnd(); }, 2000);
NodeJS を使用しているため、V8 を使用していますFunction#bind
。bind
(ブラウザでこれを行っていた場合、古いブラウザをサポートする必要がある場合は、shim を提供するように注意する必要があります。)