Ответ 1
afaik невозможно узнать, где он произошел. но вы можете увидеть Exception.message для получения информации о том, что произошло.
example: http://jsbin.com/IRoDiJIV/1/watch?js
Чтобы сократить длинный раздел комментариев "Не использовать новую функцию" и/или "eval is evil", этот вопрос касается того, как получить доступ, если возможно, к информации об ошибке, связанной с конструктором new Function()
, Это в основном вопрос об обнаружении ограничения в том, что браузер позволит мне делать, пытаясь использовать JavaScript в той мере, в какой позволяют спецификации и стандартные версии браузера. Итак, с этим отказом на месте:
При оценке кода с помощью нового вызова Function() существует ли способ узнать, где в содержимом функции возникает синтаксическая ошибка, если выполняется анализ кода недействительного синтаксиса? то есть:.
try {
var generator = new Function(input);
try {
generator();
}
catch (runtimeError) {
console.error("legal code; unforeseen result: ", runtimeError);
}
}
catch (syntaxError) {
console.error("illegal code; syntax errors: ", syntaxError);
}
Когда здание генератора выходит из строя, существует ли способ узнать (из браузера, не используя jslint или другую внешнюю библиотеку), что такое ошибка или где она произошла?
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SyntaxError/prototype упоминает, что свойство SyntaxError имеет свойство filename
и linenumber
, но это undefined для динамического кода, оцененного с помощью новой функции (), из того, что я могу сказать, поэтому полагаться на сам объект ошибки, кажется, не вариант. Существуют ли альтернативные способы введения кода в браузер, чтобы код, как только мы знаем, что он имеет синтаксические ошибки из-за неудачного нового вызова функции, может быть использован, чтобы выяснить, где проблема в соответствии с используемым двигателем JS?
(Конечно, если целью было просто найти синтаксические ошибки, то jslint в качестве шага препроцесса будет подходящим решением, но меня больше интересует, могут ли браузеры каким-либо образом сообщать об этом информации, даже если в ограниченной форме, например "есть некоторая ошибка в строке / char..." )
afaik невозможно узнать, где он произошел. но вы можете увидеть Exception.message для получения информации о том, что произошло.
example: http://jsbin.com/IRoDiJIV/1/watch?js
Нашел решение самостоятельно, используя метод simiar для установки точек останова в evaled code
В панели источников инструментов chrome dev я помещаю следующее в условную точку останова на строку new Function
(так как это код библиотеки, и я не могу ее изменить).
(function(eval_js, load_js) {
try {
eval(eval_js);
} catch (e) {
(function addCode(js) {
var e = document.createElement('script');
e.type = 'text/javascript';
e.src = 'data:text/javascript;charset=utf-8,' + escape(js);
document.body.appendChild(e);
console.warn("Inserted Script for ", js);
})(load_js.replace(/;/g,";\n"));
handlerCode = "";
return false;
}
return false;
})("new Function('event', handlerCode)", handlerCode)