Получить выражение аргумента перед оценкой - PullRequest
0 голосов
/ 18 января 2011

Я пытаюсь создать метод assert в Javascript.Некоторое время я боролся с arguments.callee.caller и друзьями, но я не могу найти способ надежно получить полный текст вызывающей функции и найти, какое совпадение в этом тексте называется текущей функцией.

Я хочу иметь возможность использовать мою функцию следующим образом:

var four = 5;
function calculate4() { return 6; }

assert(4 == 2 + 3);
assert(4 == four);      
assert(4 == calculate4());
assert(4 != 3 && 2 < 1)

и получить вывод, подобный следующему:

Утверждение 4 == 2 + 3 не удалось.Утверждение 4 == четыре не удалось.Утверждение 4 == вычисления4 () не удалось.Утверждение 4! = 3 && 2

Сейчас я не могу выйти за рамки Assertion false failed., что не очень полезно ...

Я бы хотел избежать передачи дополнительных параметров (например,как this), потому что я хочу сохранить код подтверждения как можно более чистым и потому, что он будет напечатан много, много раз.Я не против сделать это строкой, но меня беспокоят проблемы с областями видимости при попытке eval () этой строки.Если у меня нет других вариантов или мои опасения необоснованны, скажите, пожалуйста.

Я запускаю это в приложении .hta на Windows, так что это действительно jscript, и у меня есть полный доступ кфайловая система, ActiveX и т. д., поэтому системные решения подходят (если они не требуют Firebug и т. д.).Однако я бы предпочел общее решение.

Ответы [ 3 ]

1 голос
/ 18 января 2011

Нет надежного способа сделать это, передавая только один аргумент. Даже с eval используемые переменные будут вне области видимости. Разбор arguments.caller сработает, если arguments.caller сделает только один вызов assert, найдя его и проанализировав выражение аргумента. К сожалению, ни один из проприетарных инструментов, доступных вам, не поможет.

0 голосов
/ 19 октября 2013

Это действительно возможно, по крайней мере, в браузерах и Node.js. Я не знаю о приложениях .hta.

Современные браузеры, Node.js и, надеюсь, ваша среда добавляет stack свойство в объекты ошибок, содержащие трассировку стека. Вы можете создать новую ошибку, а затем проанализировать путь к файлу, содержащему вызов assert(), а также номер строки и номер столбца (если доступно) вызова. Затем прочитайте исходный файл и вырежьте выражение assert в заданной позиции.

  1. Построить error
  2. Разбор error.stack, для получения filepath, lineNumber и columnNumber
  3. Прочитайте file в filepath
  4. Вырежьте нужные биты рядом с lineNumber и columnNumber in file

Я написал такую ​​функцию assert, которая называется yaba , которая может помочь вам.

0 голосов
/ 18 января 2011

В итоге я использовал следующую функцию, которая позволяет мне дополнительно дублировать текст утверждения в качестве второго аргумента.Это казалось самым простым.

<code>function assert(expression, message) 
{
    if (!expression) {
        if (message + "" != "undefined" && message + "" != "") {
            document.write("<h2>Assertion <pre>" +
                            message + 
                           "
не удалось.
");} else {document.write ("

Утверждение не удалось.


");}}}

Может быть, это кому-то поможет. Возможно, есть лучшие методы, но у меня это сработало.

Обратите внимание, что я программирую на Javascript всего три дня, так что, вероятно, есть рядулучшения, которые могут быть сделаны.

...