2013-04-01 2 views
1

Я хотел бы сделать что-то вроде этого:Javascript: Возвращаемые значения, созданные в Eval

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

, который через 2 секунды должен вывести:

{ "a" : 10 } 

как-то возможно ли это?

+1

[Вы действительно не должны использовать 'eval' для этого] (http : //stackoverflow.com/q/197769/1615483). –

+0

@Adam, Измените 'end()' на 'end.call ({" a ": a})'. Это то, что вы хотите? – Pacerier

ответ

3

Да:

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, имеет ссылку на контекст выполнения, в котором она была создана, и все переменные в ней, и поэтому имеет доступ к selfa).

Если там не действительно хорошая причина для использования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, если вам нужно поддерживать старые браузеры.)

+0

Причина, по которой я хотел бы использовать 'eval', заключается в том, что javascript хранится в файле, и я должен его оценить. – Adam

+0

и есть ли способ получить только переменные, которые были созданы внутри eval? С 'this', я получаю все объекты из глобальной переменной тоже в node.js – Adam

+0

Пожалуйста, не могли бы вы проверить мой дальнейший вопрос, который возник из этого? http://stackoverflow.com/questions/15753308/javascript-how-to-get-the-variables-that-were-created-inside-a-function – Adam

Смежные вопросы