2012-07-17 88 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

相關問題