"सख्त मोड" क्या है और इसका उपयोग कैसे किया जाता है?


134

मैं मोज़िला डेवलपर नेटवर्क पर जावास्क्रिप्ट संदर्भ देख रहा हूं, और मुझे कुछ कहा गया है "strict mode"। मैंने इसे पढ़ा और मुझे यह समझने में परेशानी हो रही है कि यह क्या करता है। क्या कोई संक्षेप में (सामान्य रूप से) समझा सकता है कि इसका उद्देश्य क्या है और यह कैसे उपयोगी है?


जवाबों:


149

इसका मुख्य उद्देश्य अधिक जाँच करना है।

बस "use strict";अपने कोड के शीर्ष पर, कुछ और से पहले जोड़ें ।

उदाहरण के लिए, blah = 33;मान्य जावास्क्रिप्ट है। इसका मतलब है कि आप पूरी तरह से वैश्विक चर बना सकते हैं blah

लेकिन सख्त मोड में इसकी त्रुटि है क्योंकि आपने चर घोषित करने के लिए कीवर्ड "var" का उपयोग नहीं किया है।

ज्यादातर समय आप कुछ मनमाने दायरे के बीच में वैश्विक चर बनाने के लिए नहीं होते हैं, इसलिए अधिकांश समय जो blah = 33लिखा जाता है वह एक त्रुटि है और प्रोग्रामर वास्तव में यह नहीं चाहता कि यह एक वैश्विक चर हो, उनका मतलब था लिखना var blah = 33

यह ऐसी बहुत सी चीजों को अस्वीकार करता है जो तकनीकी रूप से वैध हैं। NaN = "lol"कोई त्रुटि उत्पन्न नहीं करता है। यह NaN के मूल्य को भी नहीं बदलता है। यह (और इसी तरह के अजीब बयान) का उपयोग करना त्रुटियों का उत्पादन करता है। ज्यादातर लोग इसकी सराहना करते हैं क्योंकि कभी लिखने का कोई कारण नहीं है NaN = "lol", इसलिए एक टाइपो होने की संभावना थी।

कठोर मोड पर एमडीएन पृष्ठ पर और पढ़ें


4
यह MDN पर दस्तावेज़ का एक सटीक डुप्लिकेट है
nkcmr

23
आप इसकी उपयोगिता के बारे में क्या नहीं समझते हैं? इसका उद्देश्य उन चीजों को पकड़कर विकास में मदद करना है जो वैध-लेकिन-सबसे-संभावित-त्रुटियां हैं।
साइमन सरिस

34

साइमन के जवाब में पहले से उल्लेख नहीं किए गए सख्त मोड का एक पहलू यह है कि फ़ंक्शन इनवोकेशन के माध्यम से लागू किए गए फ़ंक्शन में सख्त मोड सेट करता thisहै undefined

तो इस तरह की बातें

function Obj() {
   this.a = 12;
   this.b = "a";
   this.privilegedMethod = function () {
      this.a++;
      privateMethod();
   };

   function privateMethod() {
     this.b = "foo";
   }
}

जब privateMethodकॉल किया जाता है तो एक त्रुटि होगी (क्योंकि आप किसी प्रॉपर्टी को नहीं जोड़ सकते हैं undefined), बजाय बेकार bवस्तु को वैश्विक ऑब्जेक्ट में जोड़ने के ।


4
हाँ जोड़ने privateMethod.bind(this)();और साथ कॉल करने की आवश्यकता हैnew jsbin.com
hlcs

सख्त मोड में सबसे महत्वपूर्ण प्रतिबंध: docs.microsoft.com/en-us/scripting/javascript/advanced/…
कृष्ण मोहन

21

सख्त मोड को इसलिए जोड़ा गया था ताकि EcmaScript का एक आसानी से सांख्यिकीय-विश्लेषण करने योग्य उपसमुच्चय होगा जो भाषा के भविष्य के संस्करणों के लिए एक अच्छा लक्ष्य होगा। सख्त मोड को इस उम्मीद में भी डिज़ाइन किया गया था कि जो डेवलपर्स खुद को सख्त मोड तक सीमित रखते हैं वे कम गलतियाँ करेंगे और वे जो बग करते हैं वह अधिक स्पष्ट तरीके से प्रकट होगा।

सद्भाव , जो उम्मीद है कि एक्मास्क्रिप्ट का अगला प्रमुख संस्करण बन जाएगा, ईएस 5 सख्त के ऊपर बनाया जाएगा।

कई मोड से बचने के लिए सद्भाव ES5 सख्त मोड पर बनाता है।

कुछ अन्य भाषा प्रयोग भी सख्त मोड पर निर्भर करते हैं। एसईएस ईएस 5 सख्त मोड के विश्लेषण पर निर्भर करता है।

SES (सुरक्षित ECMAScript) डिजाइन प्रयोग

ES5 / Strict में फीचर्स को हटाकर या रिपेयर करके ऑब्जेक्ट कैपेबिलिटी प्रोग्रामिंग लैंग्वेज डिजाइन करें।

एसईएस से ईएस 5 / स्ट्रिक्ट का सीधा-सीधा अनुवाद होना चाहिए।

मानक के अनुलग्नक सी सख्त मोड और सामान्य मोड के बीच के अंतर को बताते हैं।

सख्त मोड प्रतिबंध और अपवाद

  • पहचानकर्ता "इम्प्लीमेंट्स", "इंटरफ़ेस", "लेट", "पैकेज", "प्राइवेट", "प्रोटेक्टेड", "पब्लिक", "स्टैटिक" और "यील्ड" को सख्त मोड कोड के भीतर FutureReservedWord टोकन के रूप में वर्गीकृत किया गया है। (7.6.12 [?])।
  • एक अनुरूप कार्यान्वयन, जब सख्त मोड कोड को संसाधित करते हैं, तो ऑक्टेलेइंटरलिटरल को B.1.1 में वर्णित के रूप में शामिल करने के लिए NumericLiteral (7.8.3) के सिंटैक्स का विस्तार नहीं कर सकता है।
  • एक अनुरूप कार्यान्वयन, जब सख्त मोड कोड को संसाधित करता है (10.1.1 देखें), B.1.2 में वर्णित अनुसार OctalEscapeSequence को शामिल करने के लिए EscapeSequence के सिंटैक्स का विस्तार नहीं कर सकता है।
  • अघोषित पहचानकर्ता या अन्यथा अनार्य संदर्भ के लिए असाइनमेंट वैश्विक ऑब्जेक्ट में कोई संपत्ति नहीं बनाता है। जब एक साधारण असाइनमेंट सख्त मोड कोड के भीतर होता है, तो इसके LeftHandSide को किसी अनचाहे संदर्भ का मूल्यांकन नहीं करना चाहिए। यदि यह करता है एक ReferenceError अपवाद फेंक दिया जाता है (8.7.2)। LeftHandSide भी विशेषता मान {[[लिखने योग्य]]: झूठा}, गुण मान {[सेट]]: अपरिभाषित} के साथ एक संपत्ति संपत्ति के लिए एक डेटा संपत्ति के लिए एक संदर्भ नहीं हो सकता है, और न ही एक गैर के लिए किसी ऐसी वस्तु की संपत्ति जिसका [[एक्स्टेंसिबल]] आंतरिक संपत्ति का मूल्य गलत है। इन मामलों में एक TypeError अपवाद (11.13.1) फेंका गया है।
  • पहचानकर्ता का प्रमाण या तर्क किसी असाइनमेंट ऑपरेटर के वामहैंडसाइड एक्सप्रेशन (11.13) या पोस्टफ़िक्स एक्सप्रेशन (11.3) के रूप में या एक प्रीफ़िक्स इंक्रीमेंट (11.4.4) या एक प्रीइंफ़्री डिक्लेरेशन (11.4.5) ऑपरेटर द्वारा संचालित UnaryExpression के रूप में प्रकट नहीं हो सकता है। । सख्त मोड फ़ंक्शंस के लिए तर्क ऑब्जेक्ट "कॉलर" और "कैलेली" नाम के गैर-कॉन्फ़िगर योग्य एक्सेसर गुणों को परिभाषित करते हैं जो एक्सेस (10.6) पर एक टाइपर अपवाद छोड़ देते हैं।
  • सख्त मोड फ़ंक्शंस के लिए आब्जेक्ट्स ऑब्जेक्ट्स अपने फ़ैमिली इंडेक्स किए गए प्रॉपर्टी वैल्यूज़ को अपने फ़ंक्शंस के संबंधित औपचारिक पैरामीटर बाइंडिंग के साथ गतिशील रूप से साझा नहीं करते हैं। (10.6)। सख्त मोड फ़ंक्शंस के लिए, यदि कोई तर्क ऑब्जेक्ट बनाया जाता है, तो तर्क पहचान ऑब्जेक्ट के लिए स्थानीय पहचानकर्ता तर्क का बंधन अपरिवर्तनीय होता है और इसलिए असाइनमेंट एक्सप्रेशन का लक्ष्य नहीं हो सकता है। (10.5)।
  • यह एक SyntaxError है यदि सख्त मोड कोड में किसी भी डेटा संपत्ति (11.5.5) की एक से अधिक परिभाषा के साथ एक ObjectLiteral होता है। यह एक SyntaxError है यदि Identifier "eval" या Identifier "बहस" एक PropertyAssignment के एक PropertySetParameterList में Identifier के रूप में होता है जो सख्त कोड में निहित होता है या यदि कोई फ़ंक्शनबॉडी सख्त कोड (11.1.5) है।
  • सख्त मोड eval कोड, वेरिएबल या फ़ंक्शंस को कॉल करने के वेरिएबल एनवायरनमेंट में एक्सेप्ट नहीं कर सकता है। इसके बजाय, एक नया परिवर्तनशील वातावरण बनाया जाता है और उस वातावरण का उपयोग eval code (10.4.2) के लिए बाइंडिंग इंस्टेंटेशन के लिए किया जाता है।
  • यदि यह सख्त मोड कोड के भीतर मूल्यांकन किया जाता है, तो यह मान किसी ऑब्जेक्ट के लिए बाध्य नहीं है। अशक्त या अपरिभाषित का यह मान वैश्विक वस्तु में परिवर्तित नहीं होता है और आदिम मूल्यों को आवरण की वस्तुओं में नहीं बदला जाता है। यह मान एक फ़ंक्शन कॉल के माध्यम से पारित किया गया था (इसमें फ़ंक्शन.prototype.apply और Function.prototyp.call का उपयोग करके किए गए कॉल शामिल हैं) इस मान को किसी ऑब्जेक्ट (10.4.3, 11.1.1, 15.3.4.3, 15.3) के लिए ज़ब्त नहीं करते हैं। 4.4)।
  • जब कोई हटाने वाला ऑपरेटर सख्त मोड कोड के भीतर होता है, तो एक SyntaxError फेंक दिया जाता है यदि उसका UnaryExpression एक चर, फ़ंक्शन तर्क, या फ़ंक्शन नाम (11.4.1) का प्रत्यक्ष संदर्भ है।
  • जब कोई हटाने वाला ऑपरेटर सख्त मोड कोड के भीतर होता है, तो एक टाइप-इयररोड को फेंक दिया जाता है यदि हटाए जाने वाले गुण में विशेषता {[[विन्यास योग्य]]: गलत} (11.4.1) है। यह एक SyntaxError है यदि VariableDeclaration या VariableDeclarationNoIn सख्त कोड के भीतर होता है और इसका पहचानकर्ता eval या तर्क है (12.2.1)।
  • सख्त मोड कोड में एक WithStatement शामिल नहीं हो सकता है। इस तरह के संदर्भ में एक WithStatement की घटना एक SyntaxError (12.10) है।
  • यह एक SyntaxError है अगर एक पकड़ने के साथ एक TryStatement सख्त कोड के भीतर होता है और पकड़ो उत्पादन की पहचान स्पष्ट या तर्क है (12.14.1)
  • यह एक SyntaxError है यदि पहचानकर्ता का प्रमाण या तर्क एक सख्त मोड के FormalParameterList के भीतर दिखाई देता है FunctionDeclaration या FunctionExpression (13.1)
  • एक सख्त मोड फ़ंक्शन में दो या अधिक औपचारिक पैरामीटर नहीं हो सकते हैं जिनका समान नाम है। फंक्शनडक्लेरेशन, फंक्शनएक्सप्रेशन, या फंक्शन कंस्ट्रक्टर का उपयोग करके इस तरह के फ़ंक्शन को बनाने का प्रयास एक सिंटैक्सएयर (13.1, 15.3.2) है।
  • एक कार्यान्वयन का विस्तार नहीं हो सकता है, जो इस विनिर्देश में परिभाषित है, कॉलर या फ़ंक्शन इंस्टेंस के तर्कों के गुणों के सख्त मोड कार्यों के भीतर अर्थ। ECMAScript कोड फ़ंक्शन मोड ऑब्जेक्ट्स पर इन नामों के साथ गुणों को बना या संशोधित नहीं कर सकता है जो सख्त मोड फ़ंक्शन (10.6, 13.2, 15.3.4.5.3) के अनुरूप हैं।
  • यह एक कड़ी मोड कोड के रूप में उपयोग करने के लिए एक SyntaxError पहचानकर्ता eval या तर्क एक FunctionDeclaration या FunctionExpression की पहचानकर्ता या एक औपचारिक पैरामीटर नाम (13.1) के रूप में है। फंक्शन कंस्ट्रक्टर (15.3.2) का उपयोग करके इस तरह के एक सख्त मोड फ़ंक्शन को गतिशील रूप से परिभाषित करने का प्रयास एक सिंटेक्सऑक्स्रम अपवाद को फेंक देगा।

6

ECMAScript 5 ने सख्त मोड की अवधारणा पेश की ।

कोड में सख्त मोड का आह्वान

सख्त मोड पूरी स्क्रिप्ट या व्यक्तिगत फ़ंक्शन पर लागू होता है। यह {} ब्रेसिज़ में संलग्न ब्लॉक स्टेटमेंट पर लागू नहीं होता है, इसे ऐसे संदर्भों पर लागू करने का प्रयास कुछ भी नहीं करता है।

संपूर्ण स्क्रिप्ट:

मान लें कि हम app.js बना रहे हैं, इसलिए पहले स्टेटमेंट यूज़ स्क्रिप्ट को जोड़ने से पूरे कोड के लिए सख्त मोड लागू हो जाएगा।

// app.js whole script in strict mode syntax
use strict”;
// Now you can start writing your code 

समारोह के लिए सख्त मोड:

किसी फ़ंक्शन के लिए सख्त मोड को आमंत्रित करने के लिए, सटीक कथन "सख्त उपयोग करें" डालें; किसी अन्य बयान से पहले फ़ंक्शन बॉडी की शुरुआत में।

function yourFunc(){
 "use strict";

 // Your function code logic
}

सख्त मोड सामान्य जावास्क्रिप्ट शब्दार्थ में कई बदलावों को शामिल करता है। पहले सख्त मोड त्रुटियों को फेंकने के लिए उन्हें बदलकर कुछ जावास्क्रिप्ट मूक त्रुटि को समाप्त करते हैं।

उदाहरण के लिए: सख्त मोड का उपयोग कर कोड

यहां छवि विवरण दर्ज करें

कोड में सख्त मोड का उपयोग किए बिना उपरोक्त कोड उदाहरण में, यह एक त्रुटि नहीं फेंकेगा। जैसा कि हम xघोषित किए बिना परिवर्तनशील पहुंच रहे हैं । अतः सख्त मोड में अघोषित वैरिएबल एक्सेस करने में त्रुटि होती है।

अब चर संस्करण को बिना सख्त मोड के घोषित किए बिना एक्सेस करने का प्रयास करते हैं।

(function(){
    x = 3;
})();

// Will not throw an error

सख्त मोड का उपयोग करने का लाभ:

  • जावास्क्रिप्ट साइलेंट एरर को फेंक कर एरर को खत्म करें।
  • गलती को ठीक करता है जो अनुकूलन करने के लिए जावास्क्रिप्ट इंजन के लिए मुश्किल बनाता है।
  • समान कोड की तुलना में कोड को कुछ समय तेज चलाएं जो कि सख्त मोड में नहीं है
  • ECMAScript के भविष्य के संस्करण में कुछ सिंटैक्स को परिभाषित किए जाने की संभावना है।

5

सख्त मोड सामान्य जावास्क्रिप्ट शब्दार्थ में कई बदलाव करता है।

  • सख्त मोड त्रुटियों को फेंकने के लिए उन्हें बदलकर कुछ जावास्क्रिप्ट मूक त्रुटियों को समाप्त करता है।

  • सख्त मोड गलतियों को ठीक करता है जो अनुकूलन करने के लिए जावास्क्रिप्ट इंजन के लिए मुश्किल बनाते हैं।

  • सख्त मोड ईसीएमएस्क्रिप्ट के भविष्य के संस्करणों में परिभाषित किए जाने वाले कुछ वाक्यविन्यास को प्रतिबंधित करता है।


1

ECMAScript5कुछ नई वस्तुओं और गुणों का परिचय देता है और तथाकथित भी "strict mode"

सख्त मोड भाषा का एक सबसेट है जो अपग्रेड की गई सुविधाओं को शामिल नहीं करता है। सख्त मोड ऑप्ट-इन है और इसकी आवश्यकता नहीं है, जिसका अर्थ है कि यदि आप चाहते हैं कि आपका कोड सख्त मोड में चले, तो आप निम्न स्ट्रिंग का उपयोग करके अपने इरादे की घोषणा करते हैं (एक बार फ़ंक्शन के अनुसार, या एक बार)।

"use strict";

1

2017 और मैंने अंत में प्रलेखन पाया:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode

सख्त मोड जावास्क्रिप्ट के प्रतिबंधित संस्करण में चुनने का एक तरीका है। सख्त मोड सिर्फ एक सबसेट नहीं है: यह जानबूझकर सामान्य कोड से अलग शब्दार्थ है। सख्त मोड का समर्थन नहीं करने वाले ब्राउज़र, ब्राउज़र से अलग व्यवहार के साथ सख्त मोड कोड चलाएंगे, इसलिए सख्त मोड के प्रासंगिक पहलुओं के समर्थन के लिए फ़ीचर-परीक्षण के बिना सख्त मोड पर भरोसा न करें। सख्त मोड कोड और गैर-सख्त मोड कोड सह-अस्तित्व में हो सकते हैं, इसलिए स्क्रिप्ट सख्त मोड में आकस्मिक रूप से विकल्प चुन सकते हैं।


सख्त मोड सामान्य जावास्क्रिप्ट शब्दार्थ में कई बदलाव करता है। सबसे पहले, सख्त मोड त्रुटियों को फेंकने के लिए उन्हें बदलकर कुछ जावास्क्रिप्ट मूक त्रुटियों को समाप्त करता है। दूसरा, सख्त मोड गलतियों को ठीक करता है जो अनुकूलन करने के लिए जावास्क्रिप्ट इंजन के लिए कठिन बनाते हैं: सख्त मोड कोड कभी-कभी समान कोड की तुलना में तेजी से चलाने के लिए बनाया जा सकता है जो कि सख्त मोड नहीं है। तीसरा, सख्त मोड ईसीएमएस्क्रिप्ट के भविष्य के संस्करणों में परिभाषित किए जाने वाले कुछ वाक्यविन्यास को प्रतिबंधित करता है।


0

प्रश्न:
निम्नलिखित समस्या है जिसका मुझे सामना करना पड़ा, मैं एक ट्यूटोरियल का अनुसरण कर रहा था और यह निम्नलिखित scssफ़ाइल को संकलित करने की कोशिश कर रहा था और इसमें से सीएसएस उत्पन्न करने की कोशिश कर रहा था,

.fatty{
  width: percentage(6/7);
}

निम्नलिखित gulpfile.jsकार्य का उपयोग करना:

var gulp = require('gulp');
var sass = require('gulp-sass');

gulp.task('sass', function () {
    return gulp.src('app/scss/styles.scss')
        .pipe(sass())
        .pipe(gulp.dest('app/css'))
});

इसलिए मुझे जो त्रुटि मिल रही है वह इस प्रकार है:

~/htdocs/Learning/gulp1/node_modules/gulp-sass/index.js:66
    let sassMap;
    ^^^

SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:373:25)
// stacktrace here...

समाधान:
तो यह मुझे index.jsफ़ाइल दिखाता है जो मेरे gulp-sass मॉड्यूल के अंदर है (जो मूल रूप से बंद है और इसे संपादित नहीं किया जाना चाहिए)। लेकिन अगर मैं जबरदस्ती जाता हूं और "use_strict"उस index.jsफ़ाइल के शीर्ष पर जोड़ देता हूं, तो यह मेरे कार्य को सुचारू रूप से चलाता है।

मैं असहाय था, इसलिए मैं इसका उपयोग समाधान के रूप में करता रहता हूं! लेकिन फिर कुछ अन्य एसओ Q & A के माध्यम से जाने के बाद मैंने निम्नलिखित उत्तर देखा :

sudo npm install -g n
sudo n stable

और जल्द ही मैंने अपने NodeJs (Version10.x पर) को अपडेट कर दिया, और फिर टर्मिनल के निर्देशानुसार निम्नलिखित कमांड चलाकर गुल्प को फिर से बनाया।

npm rebuild node-sass --force

और यह सब ठीक है। तो यह है कि यह कैसे हल हो गया। मैंने उन बदलावों को पूर्ववत् किया है जो मैंने index.jsgulp मॉड्यूल फ़ाइल के लिए किए थे। और अब यह आसानी से चलता है।

आशा है कि यह उत्तर किसी के लिए उपयोगी होगा!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.