2012-05-07 39 views
50

क्या यह जांचने के लिए वैसे भी है कि सख्त मोड 'सख्त उपयोग' लागू किया गया है या नहीं, और हम सख्त मोड और गैर-सख्त मोड के लिए अन्य कोड के लिए अलग-अलग कोड निष्पादित करना चाहते हैं। जब आप सख्त मोड में हैं जैसे isStrictMode();//booleanक्या सख्त मोड लागू किया गया है या नहीं, यह जांचने का कोई तरीका है?

उत्तर

62

तथ्य यह है कि this एक समारोह वैश्विक संदर्भ में कहा जाता है वैश्विक वस्तु को इंगित नहीं होगा अंदर कठोर मोड पता लगाने के लिए इस्तेमाल किया जा सकता:

var isStrict = (function() { return !this; })(); 

डेमो:

> echo '"use strict"; var isStrict = (function() { return !this; })(); console.log(isStrict);' | node 
true 
> echo 'var isStrict = (function() { return !this; })(); console.log(isStrict);' | node 
false 
+0

ग्रेट में बदलने का। यह सुरुचिपूर्ण है और हर जगह काम करता है। –

+0

स्पष्टीकरण के लिए, रिटर्न स्टेटमेंट 'इस === अपरिभाषित' को वापस करने के बराबर है, यह वैश्विक ऑब्जेक्ट की तुलना नहीं कर रहा है, यह सिर्फ यह जांच रहा है कि यह 'मौजूद है या नहीं। – aljgom

7

हाँ, this समारोह के लिए खोज रहे हैं एक वैश्विक विधि के भीतर 'undefined' है।

function isStrictMode() { 
    return (typeof this == 'undefined'); 
} 
18
function isStrictMode() { 
    try{var o={p:1,p:2};}catch(E){return true;} 
    return false; 
} 

ऐसा लगता है कि आपको पहले से ही एक उत्तर मिला है। लेकिन मैंने पहले ही कुछ कोड लिखा है। तो यहाँ

+1

यह मेहदी के जवाब से बेहतर है क्योंकि यह न केवल वैश्विक दायरे में बल्कि हर जगह काम करेगा। बढ़ा। :) – mgol

+7

इसका परिणाम सिंटैक्स त्रुटि में होता है, जो कोड चलाने से पहले होता है, इसलिए इसे पकड़ा नहीं जा सकता है ... – skerit

+3

यह ES6 में काम नहीं करेगा, क्योंकि गणना की गई संपत्ति नामों को अनुमति देने के लिए चेक हटा दिया गया है। –

16

मैं कुछ है कि अपवाद का उपयोग नहीं करता है और काम करता है किसी भी सन्दर्भ में पसंद करते हैं, केवल वैश्विक एक नहीं:

var mode = (eval("var __temp = null"), (typeof __temp === "undefined")) ? 
    "strict": 
    "non-strict"; 

यह कठोर मोड में तथ्य eval में एक नया वेरिएबल परिचय नहीं है का उपयोग करता है बाहरी संदर्भ।

+0

जिज्ञासा से बाहर, 2015 में बुलेटप्रूफ यह कैसे है, अब ईएस 6 यहां है? –

+2

मैं सत्यापित करता हूं कि यह नवीनतम क्रोम और नोडजेस पर ES6 में काम करता है। –

+1

सुरुचिपूर्ण और काम कर रहा है, धन्यवाद! – rudyryk

1

अधिक सुरुचिपूर्ण तरीका: यदि "इस" वस्तु है, यह सच

"use strict" 

var strict = (function() { return !!!this })() 

if (strict) { 
    console.log ("strict mode enabled, strict is " + strict) 
} else { 
    console.log ("strict mode not defined, strict is " + strict) 
} 
संबंधित मुद्दे

 संबंधित मुद्दे