Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.10.2012, 13:13
Профессор
Отправить личное сообщение для Почемучкин Посмотреть профиль Найти все сообщения от Почемучкин
 
Регистрация: 11.05.2011
Сообщений: 241

Как вызвать eval в контексте другой функции для доступа к ее локальным переменным?
Как вызвать eval в контексте другой функции для доступа к ее локальным переменным?
Это нужно для передачи имен переменных в debug-функцию. Но проблема в том, что в функции куда эти имена передаются эти переменные не определены - поэтому eval возвращает ошибку (исключение).

function debugFunc(name){
   try{
       alert( 'debug: ' + name + "=" + eval(name) );
   }catch(err){alert('debug: ' + err);}
}

function someFunc() {
   var ABCD = 10;
   debugFunc( "ABCD" );
   alert( 'internal: ABCD='+ eval( "ABCD" ) );
}

someFunc();
Ответить с цитированием
  #2 (permalink)  
Старый 29.10.2012, 13:35
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,813

О боже
Что ты пытаешься сделать?
__________________
.
Ответить с цитированием
  #3 (permalink)  
Старый 29.10.2012, 14:12
Профессор
Отправить личное сообщение для Hoshinokoe Посмотреть профиль Найти все сообщения от Hoshinokoe
 
Регистрация: 08.01.2012
Сообщений: 253

Почемучкин,

Eval выполняется в глобальной области видимости. В принципе использовать eval - плохая практика, лучше объясни что ты пытаешься сделать.
Ответить с цитированием
  #4 (permalink)  
Старый 29.10.2012, 14:15
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,813

Hoshinokoe,
Тоже самое что и я написал, только у меня это поместилось в два слова: "О боже"
Точнее дело даже не в eval, просто не понимаю зачем это!
UPD: В общем можешь так:
function debugFunc(name){
	try{
		alert( 'debug: ' + name + "=" + eval(name) );
	}catch(err){alert('debug: ' + err);}
}

function someFunc() {
	this.ABCD = 10;
	debugFunc("ABCD");
	alert( 'internal: ABCD='+ eval( "ABCD" ) );
}

someFunc();

Но лучше объясни зачем это тебе.
__________________
.

Последний раз редактировалось Skipp, 29.10.2012 в 15:56.
Ответить с цитированием
  #5 (permalink)  
Старый 29.10.2012, 17:16
Аватар для vadim5june
Студент
Отправить личное сообщение для vadim5june Посмотреть профиль Найти все сообщения от vadim5june
 
Регистрация: 30.04.2012
Сообщений: 1,113

что то подобное
как выполнить функцию в контексте локальных переменных
Ответить с цитированием
  #6 (permalink)  
Старый 29.10.2012, 17:21
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,813

Правда зачем это, не понятно.
Всегда можно передать переменную как минимум в качестве параметра, я не пойму что автор топика хочет дебажить таким способом...
__________________
.
Ответить с цитированием
  #7 (permalink)  
Старый 29.10.2012, 17:23
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Skipp
О боже
Что ты пытаешься сделать?
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #8 (permalink)  
Старый 29.10.2012, 22:11
Профессор
Отправить личное сообщение для Почемучкин Посмотреть профиль Найти все сообщения от Почемучкин
 
Регистрация: 11.05.2011
Сообщений: 241

Эта функция выводит список переменных и их значений - нужно для дебаггинга букмарклетов, чтобы не писать многоэтажные alert("ABCD="+ABCD+"\nEFGH="+EFGH+"\n ...)
Но вообще-то еще и просто интересно.

Skipp, в твоем примере this.ABCD - это то же, что window.ABCD, поэтому переменная просто объявляется как глобальная переменная (это же можно сделать просто убрав var в объявлении) - не подходит там, где нужны только локальные переменные. И именно в этом загвоздка.
Ответить с цитированием
  #9 (permalink)  
Старый 29.10.2012, 22:31
Профессор
Отправить личное сообщение для Почемучкин Посмотреть профиль Найти все сообщения от Почемучкин
 
Регистрация: 11.05.2011
Сообщений: 241

vadim5june,
Спасибо за ссылку - там действительно рабочее решение, но к сожалению создается "индивидуальная" функция, которая имеет доступ к переменным текущей. Это работает, но придется каждый раз вместо простого вызова функции debugFunc(name) проделывать такое:
txt = debugFunc.toString();
eval(txt);
debugFunc(name);

Оно конечно работает, но хотелось бы одним вызовом передавать контекст.
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48
как запустить функцию после другой функции Rentony jQuery 7 07.02.2012 18:01
как вызвать две функции для OnChange jekjuk Элементы интерфейса 4 08.11.2011 17:10
Как из функции вызвать другую функцию и правильно передать ей параметр Alexd Общие вопросы Javascript 3 06.05.2011 03:42
Как вызвать функцию из функции ? PheonixS AJAX и COMET 7 20.06.2010 09:51