在Javascript中,如何在不更改函数的情况下检查函数是否处于严格模式*
In Javascript, how can I check if a function is in strict mode *without changing the function*?
我想写一个测试套件,以确保某些给定的函数使用严格模式。它们有很多,手动检查它们似乎是一件烦人的事。
类似问题的答案使用函数定义上的正则表达式进行检查。然而,我相信这会错误地检测到被测试的函数位于具有"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提升到Program级别,并检查是否存在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
)
严格模式函数确实有一个"中毒"的.caller
和.arguments
属性(还有ES5,额外),所以您可以测试它:
function isStrict(fn) {
if (typeof fn != "function")
throw new TypeError("expected function");
try {
fn.caller; // expected to throw
return false;
} catch(e) {
return true;
}
}
相关文章:
- 检查onsubmit doenst work jquery contactform上的函数
- Javascript函数检查日期
- Javascript 函数检查
- 使用 jQuery 函数检查表中的可编辑列
- Javascript 函数检查公式器中的所有输入不起作用
- 使用 JavaScript + jQuery 函数检查表行冗余的性能降低
- 如何使用JavaScript函数检查文本框的两个值
- 使用Array.every()函数检查是否定义了所有值
- 测试一个由承诺返回的函数——检查错误
- jQuery函数检查文本框
- Javascript函数检查vb变量
- 如何在AngularJS上使用service函数检查一个包db文档是否存在
- jquery.each函数检查另一个选择器并删除重复项
- 用可重用的函数检查表单值
- JS函数检查所有的复选框,这是不需要的
- 根据字符串和do函数检查ng-model的值
- 函数检查字符串并更改它们
- 函数检查第一个空白单元格
- 对于我的函数检查算法,是否有更好的替代eval() ?
- 如何使用javascript函数检查字段是否已填充数据