Да:
function end(){ console.log(this); }
eval('var a = 0, self = this; setTimeout(function(){ a = 10; end.call(self); }, 2000)');
Обратите внимание, что я установил переменную, self
, быть 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
значение. Это называется связывания и облегчается ES5 Function#bind
function:
function end(){ console.log(this); }
var a = 0, boundEnd = end.bind(this); setTimeout(function(){ a = 10; boundEnd(); }, 2000);
Поскольку вы используете NodeJS, вы используете V8, который имеет Function#bind
. (Если вы делали это в браузере, вам нужно быть осторожным, чтобы обеспечить прокладку для bind
, если вам нужно поддерживать старые браузеры.)
[Вы действительно не должны использовать 'eval' для этого] (http : //stackoverflow.com/q/197769/1615483). –
@Adam, Измените 'end()' на 'end.call ({" a ": a})'. Это то, что вы хотите? – Pacerier