Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как вызвать eval в контексте другой функции для доступа к ее локальным переменным? (https://javascript.ru/forum/misc/32754-kak-vyzvat-eval-v-kontekste-drugojj-funkcii-dlya-dostupa-k-ee-lokalnym-peremennym.html)

Почемучкин 29.10.2012 13:13

Как вызвать 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();

Skipp 29.10.2012 13:35

О боже:)
Что ты пытаешься сделать?

Hoshinokoe 29.10.2012 14:12

Почемучкин,

Eval выполняется в глобальной области видимости. В принципе использовать eval - плохая практика, лучше объясни что ты пытаешься сделать.

Skipp 29.10.2012 14:15

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();

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

vadim5june 29.10.2012 17:16

что то подобное
http://javascript.ru/forum/jquery/30...remennykh.html

Skipp 29.10.2012 17:21

Правда зачем это, не понятно.
Всегда можно передать переменную как минимум в качестве параметра, я не пойму что автор топика хочет дебажить таким способом...

nerv_ 29.10.2012 17:23

Цитата:

Сообщение от Skipp
О боже
Что ты пытаешься сделать?

:D

Почемучкин 29.10.2012 22:11

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

Skipp, в твоем примере this.ABCD - это то же, что window.ABCD, поэтому переменная просто объявляется как глобальная переменная (это же можно сделать просто убрав var в объявлении) - не подходит там, где нужны только локальные переменные. И именно в этом загвоздка.

Почемучкин 29.10.2012 22:31

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

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


Часовой пояс GMT +3, время: 09:31.