Поиск строки неопределенного имени переменной в ReferenceError

Мой вопрос прост, но зависит от Javascript VM.

Когда вы ловите ReferenceError (в моем случае при выполнении eval (...)), как мне вернуть реальный токен идентификатора из объекта ошибки?

Согласование "известных" сообщений об ошибках и их анализ кажутся слишком хакерскими для меня, но это единственный доступный вариант для меня прямо сейчас.

edit: На данный момент я только "сопоставляю" V8 и Firefox, делая это:

catch(e){
 if (e.name === "ReferenceError"){
 var varname = e.toString().replace("ReferenceError: ","")
 .replace(" is not defined","").trim();
 foobar(varname);
 }
 }
1 ответ

Вы должны это сделать, используя e.message и сопоставляя текст до первого места.

Следующий код работает в IE7/IE8/IE9/IE10/Chrome и Firefox.

try {
 alert(tesssst);
} catch(e){
 if (e.name === "ReferenceError" || e.name === "TypeError") { //IE7 uses TypeError instead
 var variableName = e.message.substr(0, e.message.indexOf(" "));

 //IE7 and IE8 fix (it adds ' around the variable name)
 if (variableName.substr(0, 1) == "'" && variableName.substr(variableName.length - 1) == "'") {
 variableName = variableName.substr(1, variableName.length - 2);
 }

 console.log(variableName); //tesssst
 }
}

Изменить: Добавлены исправления IE7/IE8

Изменить 2: С помощью магии регулярных выражений вы можете изменить это на следующее:

try {
 alert(tesssst);
} catch(e){
 if (e.name === "ReferenceError" || e.name === "TypeError") { //IE7 uses TypeError instead
 var variableName = e.message.match(/^'?(.*?)'? /)[1];
 console.log(variableName);
 }
}

licensed under cc by-sa 3.0 with attribution.