我想编写一个测试套件来确保一些给定的函数使用了严格模式。这些函数有很多,手动检查似乎很繁琐。
一个类似问题的答案使用函数定义的正则表达式来检查。但是,我认为这种方法会误判测试的函数在一个带有"use strict"的函数或文件级别"use strict"声明的情况下。答案说"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建议的一种方法是解析函数的源代码来找出它。如果该函数有使用严格声明(虽然这很繁琐),但如果它是从某个级别(例如程序级别)传播的严格模式,则无法找到。在这种情况下,我们必须遍历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
)