2012-07-17 77 views
0

我的问题听起来很奇怪,但有没有办法通过从另一个函数调用来理解函数是否处于严格模式?是否可以判断一个函数是否处于严格模式?

function a(){ 
    "use strict"; 
    // Body 
} 

function b(){ 
// Body 
} 

function isStrict(fn){ 

    fn.call(); 
} 

isStrict(a); // true 
isStrict(b); // false 
+0

我知道这是不是我的问题,但我真的不明白怎么可能知道,在编译时,除非你在函数内部操纵回调有用。在这种情况下,而不是你的回调,传递一个测试回调,在严格模式的情况下会崩溃,所以你可以在上面捕获错误,并在之后假设严格。 – Sebas 2012-07-17 22:19:24

回答

3

当一个函数受严格模式影响时,"use strict";被预置。所以,下面的检查将是确定:

function isStrict(fn) { 
    return typeof fn == 'function' && 
     /^function[^(]*\([^)]*\)\s*\{\s*(["'])use strict\1/.test(fn.toString()) 
     || (function(){ return this === undefined;})(); 
} 

我用一个RegExp寻找在函数体的开始"use strict"模式。

要检测全局严格模式(这也影响函数),我想test one of the features看看严格模式是否有效。

+0

这并不普遍,就像在严格模式模块模式中定义的闭包一样。 – Bergi 2015-12-02 19:57:27

+0

@Bergi感谢您的额外信息。在Firefox中使用函数(){'use strict'; return function(){};})()。toString()'给出'function(){\ n“use strict”; \ n}'' (){}',所以它可以在一些浏览器中使用。 – 2015-12-02 20:18:45

+0

哦,有趣的是,我不知道FF做到了那个 – Bergi 2015-12-02 20:27:39

1

您可以将isStrict属性添加到您严格执行的每个功能中。

function a() { 
    "use strict"; 
} 
a.isStrict = true; 

// ... 
if (a.isStrict) { } 
+0

我想我找到了更好的方法。使用'this'。 – scusyxx 2012-07-17 22:12:54

+0

你是什么意思?如果我把'this.isStrict = true'放入函数中,它需要调用函数来设置isStrict属性。 – Will 2012-07-17 22:17:38

+0

请参阅下面的答案。我不能拿出更简单的解决方案,除了解析... – scusyxx 2012-07-17 22:18:34

相关问题