Я хочу написать набор тестов, чтобы убедиться, что некоторые заданные функции используют строгий режим. Их много, и проверять их вручную кажется рутиной.
Ответ в аналогичный вопрос использует регулярное выражение для определения функции для проверки. Однако я считаю, что это приведет к неправильному обнаружению ситуаций, когда тестируемая функция находится внутри функции с «использованием строгого» или с объявлением «использовать строгое» на уровне файла. В ответе говорится, что в начале используется "use strict", но в моей среде (Mozilla Rhino) это не так:
$ cat strict_sub.js
"use strict";
var strict_function = function() {
not_a_real_global = "foo";
};
print(strict_function);
$ rhino strict_sub.js
function () {
not_a_real_global = "foo";
}
Я чувствую, что ответ «нет», но нет ли способа проанализировать функцию, чтобы увидеть, была ли она проанализирована и признана строгой?
Обновление: один из методов, предложенных @Amy, заключался в том, чтобы проанализировать источник функции, чтобы понять это. Это работает, если функция имеет объявление use-strict (хотя это утомительно), но не в том случае, если строгий режим распространяется, скажем, на уровне программы; в этом случае мы должны поднять AST до уровня программы и проверить это для use strict
. Чтобы сделать это надежным, нам пришлось бы реализовать все правила для use strict
-распространения, которые где-то уже есть в интерпретаторе.
(Проверено в SpiderMonkey:
function f() {
"use strict";
}
var fast1 = Reflect.parse(f.toString());
var first_line = fast1.body[0].body.body[0].expression;
print(first_line.type === 'Literal' && first_line.value === 'use strict'); //true
)