1

私はこのようなことをしたいと思います:

function end(){ console.log(this); } // <-- the problem is here with `this`
eval('var a = 0; setTimeout(function(){ a = 10; end(); }, 2000)');

2秒後に出力されるはずです:

{ "a" : 10 }

これはどういうわけか可能ですか?

4

1 に答える 1

3

はい:

function end(){ console.log(this); }
eval('var a = 0, self = this; setTimeout(function(){ a = 10; end.call(self); }, 2000)');

変数 を に設定し、を呼び出すときに使用するselfことに注意してください。これにより、呼び出し中に に特定の値を設定できます。これが機能するのは、渡された無名関数が、それが作成された実行コンテキストとその中のすべての変数への参照を持ち、(and ) にアクセスできるためです。thisFunction#callendthissetTimeoutselfa

使用する本当に正当な理由がない場合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#bindbind(ブラウザでこれを行っていた場合、古いブラウザをサポートする必要がある場合は、shim を提供するように注意する必要があります。)

于 2013-04-01T17:09:15.357 に答える