Как вызвать 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();
|
О боже:)
Что ты пытаешься сделать? |
Почемучкин,
Eval выполняется в глобальной области видимости. В принципе использовать eval - плохая практика, лучше объясни что ты пытаешься сделать. |
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();
Но лучше объясни зачем это тебе. |
что то подобное
http://javascript.ru/forum/jquery/30...remennykh.html |
Правда зачем это, не понятно.
Всегда можно передать переменную как минимум в качестве параметра, я не пойму что автор топика хочет дебажить таким способом... |
Цитата:
|
Эта функция выводит список переменных и их значений - нужно для дебаггинга букмарклетов, чтобы не писать многоэтажные alert("ABCD="+ABCD+"\nEFGH="+EFGH+"\n ...)
Но вообще-то еще и просто интересно. Skipp, в твоем примере this.ABCD - это то же, что window.ABCD, поэтому переменная просто объявляется как глобальная переменная (это же можно сделать просто убрав var в объявлении) - не подходит там, где нужны только локальные переменные. И именно в этом загвоздка. |
vadim5june,
Спасибо за ссылку - там действительно рабочее решение, но к сожалению создается "индивидуальная" функция, которая имеет доступ к переменным текущей. Это работает, но придется каждый раз вместо простого вызова функции debugFunc(name) проделывать такое: txt = debugFunc.toString(); eval(txt); debugFunc(name); Оно конечно работает, но хотелось бы одним вызовом передавать контекст. |
| Часовой пояс GMT +3, время: 20:57. |