javascript - 在 Javascript 中,如何在不更改函数的情况下检查函数是否处于严格模式*?

标签 javascript strict

我想编写一个测试套件以确保某些给定函数使用严格模式。它们有很多,手动检查它们似乎是一件苦差事。

An answer in a similar question在函数定义上使用正则表达式进行检查。但是,我相信这会误检测被测试函数位于具有“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";
}

我觉得答案是否定的,但是有没有办法内省(introspection)一个函数,看看它是否被解析并发现是严格模式?

更新:@Amy 建议的一种方法是解析函数的源代码以找出它。如果 function 有一个严格使用声明(虽然它很乏味),这会起作用,但如果严格模式是从程序级传播的,则不起作用;在这种情况下,我们必须将 AST 提升到程序级别并检查 that 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

)

最佳答案

严格模式函数确实有一个 "poisoned" .caller and .arguments properties (还有 ES5 , extra ),所以你可以测试一下:

function isStrict(fn) {
    if (typeof fn != "function")
        throw new TypeError("expected function");
    try {
        fn.caller; // expected to throw
        return false;
    } catch(e) {
        return true;
    }
}

关于javascript - 在 Javascript 中,如何在不更改函数的情况下检查函数是否处于严格模式*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34051632/

相关文章:

javascript - 禁用 "use the function form of use strict"但保留 "Missing ' 使用严格声明“警告

javascript - Node JS 避免费力地将 "use strict"添加到我的所有文件中

javascript - 函数计算错误

javascript - 检查我的页面是否被缓存

javascript - Chrome 扩展程序定时重定向

Perl 全局符号需要明确的包名

javascript - 使用 "use strict"和可变范围

javascript - D3 物理重力

javascript - 模块化系统中 JavaScript 原型(prototype)的继承

JavaScript:可以使用单引号 5's Strict Mode (") 启用 ECMAScript ('use strict' use strict") 吗?