जावास्क्रिप्ट में "सख्त उपयोग" क्या करता है, और इसके पीछे क्या तर्क है?


7547

हाल ही में, मैंने अपने कुछ जावास्क्रिप्ट कोड क्रॉकफोर्ड के JSLint के माध्यम से चलाए , और इसने निम्नलिखित त्रुटि दी:

लाइन 1 चरित्र 1 में समस्या: मिसिंग "सख्त का उपयोग करें" कथन।

कुछ खोज करते हुए, मैंने महसूस किया कि कुछ लोग "use strict";अपने जावास्क्रिप्ट कोड में जोड़ते हैं । एक बार जब मैंने बयान जोड़ दिया, तो त्रुटि दिखाई देना बंद हो गई। दुर्भाग्य से, Google ने इस स्ट्रिंग स्टेटमेंट के पीछे बहुत सारे इतिहास का खुलासा नहीं किया। निश्चित रूप से यह कुछ करना होगा कि ब्राउज़र द्वारा जावास्क्रिप्ट की व्याख्या कैसे की जाती है, लेकिन मुझे नहीं पता कि इसका क्या प्रभाव होगा।

तो यह "use strict";सब क्या है , इसका क्या मतलब है, और क्या यह अभी भी प्रासंगिक है?

क्या वर्तमान में से कोई भी ब्राउज़र "use strict";स्ट्रिंग पर प्रतिक्रिया करता है या भविष्य में उपयोग के लिए है?


5
यहाँ उत्तर पुराने हैं लेकिन वे गलत हैं। सख्त मोड के लिए मुख्य तर्क प्रोग्रामिंग त्रुटियों को रोकने के लिए नहीं था - यह जावास्क्रिप्ट को शाब्दिक रूप से स्कूप किया गया था ताकि यह सांख्यिकीय रूप से अपमानजनक हो सके:]
बेंजामिन

@BenjaminGruenbaum "use strict";अकेले का उपयोग करना जेएस को शाब्दिक रूप से बंद नहीं करता है। के साथ चर की घोषणा की letऔर constभी इस्तेमाल किया जाना चाहिए।
कुरोश पसोखी

आप ब्लॉक स्कूपिंग और लेक्सिकल स्कूपिंग के बीच मिश्रण कर रहे हैं।
बेंजामिन ग्रुएनबाम

जवाबों:


4937

जावास्क्रिप्ट स्ट्रिक्ट मोड के बारे में यह लेख आपको रूचि दे सकता है: John Resig - ECMAScript 5 स्ट्रिक्ट मोड, JSON, और अधिक

कुछ दिलचस्प भागों को उद्धृत करने के लिए:

स्ट्रिक्ट मोड ECMAScript 5 में एक नई विशेषता है जो आपको "सख्त" ऑपरेटिंग संदर्भ में एक कार्यक्रम या एक फ़ंक्शन रखने की अनुमति देता है। यह सख्त संदर्भ कुछ क्रियाओं को होने से रोकता है और अधिक अपवादों को फेंकता है।

तथा:

सख्त तरीका कुछ तरीकों से मदद करता है:

  • यह अपवादों को फेंकते हुए कुछ सामान्य कोडिंग ब्लूपर्स को पकड़ता है।
  • यह त्रुटियों को रोकता है, या फेंकता है, जब अपेक्षाकृत "असुरक्षित" कार्रवाई की जाती है (जैसे कि वैश्विक वस्तु तक पहुंच प्राप्त करना)।
  • यह उन विशेषताओं को अक्षम करता है जो भ्रामक हैं या खराब तरीके से सोची गई हैं।

यह भी ध्यान दें कि आप "सख्त मोड" को पूरी फाइल पर लागू कर सकते हैं ... या आप इसे केवल एक विशिष्ट फ़ंक्शन (अभी भी जॉन रेजिग के लेख से उद्धृत) के लिए उपयोग कर सकते हैं :

// Non-strict code...

(function(){
  "use strict";

  // Define your library strictly...
})();

// Non-strict code... 

यदि आपको पुराना और नया कोड मिलाना है तो यह मददगार हो सकता है ;-)

तो, मुझे लगता है कि यह थोड़ा सा है जैसे "use strict"आप पर्ल (इसलिए नाम?) में उपयोग कर सकते हैं : यह आपको कम त्रुटि बनाने में मदद करता है, और अधिक चीजों का पता लगाने से जो टूटने का कारण बन सकती हैं।

सख्त मोड अब सभी प्रमुख ब्राउज़रों द्वारा समर्थित है

अंदर देशी ECMAScript मॉड्यूल (के साथ importऔर exportबयान) और ES6 कक्षाएं , सख्त मोड हमेशा सक्षम है और विकलांग नहीं हो सकता।


100
इतने सालों बाद डिफॉल्ट बदलना? उसके लिए बहुत देर हो चुकी है: यह कई मौजूदा साइटों / लिपियों / अनुप्रयोगों को तोड़ देगा ... केवल संभव चीज भविष्य के लिए चीजों को बेहतर बनाने में मदद करना है।
पास्कल मार्टिन

14
मैंने एक छोटे कोड स्निपेट की कोशिश की "use strict", जो फ़ायरफ़ॉक्स 3.6, सफारी 5, क्रोम 7 और ओपेरा 10.6 (सभी मैक) में उपयोग करते समय अमान्य होगा । कोई त्रुटि नहीं, इसलिए मुझे लगता है कि 'सख्त का उपयोग करें' अभी तक किसी भी ब्राउज़र में समर्थित नहीं है। ); IE9 में परीक्षण नहीं किया था, हालांकि
कर्कश

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

29
Chrome 11 को इन सभी परीक्षणों को IE10 के रूप में पास करना प्रतीत होता है। Imicrosoft.com/testdrive/HTML5/TryStrict/Default.html#
gman

12
@ जूलियस - यह एक आरक्षित कीवर्ड का उपयोग करके लागू नहीं किया जा सकता था, क्योंकि तब सख्त मोड को ट्रिगर करने की कोशिश करने वाले कोड पुराने ब्राउज़रों में टूट जाएंगे। "यादृच्छिक" स्ट्रिंग शाब्दिक जोड़ने से कुछ भी नहीं टूटता है।
nnnnnn

1245

यह ECMAScript 5 की एक नई विशेषता है। जॉन रेसिग ने इसका एक अच्छा सारांश लिखा है।

यह सिर्फ एक स्ट्रिंग है जिसे आप अपनी जावास्क्रिप्ट फाइलों में रखते हैं (या तो आपकी फ़ाइल के शीर्ष पर या किसी फ़ंक्शन के अंदर) जो इस तरह दिखता है:

"use strict";

इसे अपने कोड में रखना अब वर्तमान ब्राउज़रों के साथ कोई समस्या नहीं होनी चाहिए क्योंकि यह केवल एक स्ट्रिंग है। यह भविष्य में आपके कोड के साथ समस्या पैदा कर सकता है यदि आपका कोड प्रज्ञा का उल्लंघन करता है। उदाहरण के लिए, यदि आप वर्तमान में पहले foo = "bar"परिभाषित किए बिना हैं foo, तो आपका कोड विफल होना शुरू हो जाएगा ... जो कि मेरी राय में अच्छी बात है।


328
तेजी से विफल और जोर से विफल।
नील्स बॉम्ब

31
यदि आप HTML फ़ाइलों में जावास्क्रिप्ट इनलाइन लिख रहे हैं, तो प्रत्येक नए ब्लॉक को शुरू करें <script>"use strict";। ध्वज केवल उस ब्लॉक पर लागू होता है जिसमें यह शामिल है।
नौबर

7
यह मजाकिया है, इसके परिणामस्वरूप तार एकल उद्धरण होने चाहिए। इसलिए 'use strict';इसके बजाय लिखें
nilsi

1
तब जावास्क्रिप्ट की उत्थापन अवधारणा का क्या होगा?
सुनील शर्मा

1
@ सुनीलशर्मा यदि आप फहराने की कोशिश करते हैं, लेकिन यह विफल हो जाता है क्योंकि चर को परिभाषित नहीं किया गया है, फिलहाल यह इसे वैश्विक वस्तु में जोड़ देगा। इसके साथ "use strict";, इसके बजाय विफल हो जाएगा। यह अधिक समझ में आता है, क्योंकि अगर यह इसे वैश्विक वस्तु में जोड़ रहा है इसका मतलब है कि यह अगली बार काम नहीं कर सकता है जब आप फ़ंक्शन चलाते हैं / कुछ और करते हैं जो ब्लॉक को रीसेट करता है, क्योंकि यह उच्चतम ब्लॉक (वैश्विक) में होगा।
wizzwizz4

646

स्टेटमेंट "use strict";ब्राउज़र को स्ट्रिक्ट मोड का उपयोग करने का निर्देश देता है, जो जावास्क्रिप्ट का एक कम और सुरक्षित फीचर सेट है।

सुविधाओं की सूची (गैर-संपूर्ण)

  1. वैश्विक चर को अस्वीकार करता है। ( varचर नामों में छूटी घोषणाएं और टाइपो पकड़ता है )

  2. साइलेंट फेलिंग असाइनमेंट्स सख्त मोड में एरर देंगे (असाइन करना NaN = 5;)

  3. फेंकने योग्य गुणों को हटाने का प्रयास करेगा ( delete Object.prototype)

  4. एक अद्वितीय होने के लिए एक वस्तु शाब्दिक में सभी संपत्ति के नाम की आवश्यकता है ( var x = {x1: "1", x1: "2"})

  5. फ़ंक्शन पैरामीटर नाम अद्वितीय होना चाहिए ( function sum (x, x) {...})

  6. ऑक्टल सिंटैक्स को मना करता है ( var x = 023;कुछ देव गलत तरीके से मानते हैं कि एक पूर्ववर्ती शून्य संख्या को बदलने के लिए कुछ भी नहीं करता है।)

  7. withकीवर्ड को मना करता है

  8. eval सख्त मोड में नए चर का परिचय नहीं है

  9. सादे नामों को हटाने से मना करें ( delete x;)

  10. नामों evalऔर argumentsकिसी भी रूप में बाध्यकारी या असाइन करने की मनाही है

  11. सख्त मोड argumentsऔपचारिक मापदंडों के साथ ऑब्जेक्ट के अन्य गुणों को नहीं करता है । (यानी में function sum (a,b) { return arguments[0] + b;}यह काम करता है क्योंकि arguments[0]के लिए बाध्य है aऔर इतने पर।)

  12. arguments.callee समर्थित नहीं है

[रेफरी: सख्त मोड , मोज़िला डेवलपर नेटवर्क ]


40
Nit: वैश्विक चर की अनुमति है, बस स्पष्ट होना चाहिए (जैसे window.foo = bar)।
gcampbell

1
किसी ऑब्जेक्ट शाब्दिक में सभी संपत्ति के नाम अद्वितीय होने की आवश्यकता है (var x = {X1: "1", X1: "2"}) यह मान्य है
अरुण किल्लू

4
11 में आपका उदाहरण अनुपस्थित है (अन्यथा इसका कोई मतलब नहीं है)। अर्थात। function sum (ए, बी) {a = 0; वापसी के तर्क [0] + बी; } अलर्ट (राशि (1, 2)) अलियासिंग के कारण 3 सख्त मोड के साथ और 2 सख्त मोड के बिना वापस आ जाएगा।
डेविड गौसमान

413

अगर लोग use strictइसका उपयोग करने के बारे में चिंतित हैं, तो इस लेख की जाँच करने लायक हो सकता है:

ECMAScript 5 ब्राउज़र में 'सख्त मोड' समर्थन। इसका क्या मतलब है?
NovoGeek.com - कृष्णा का वेबलॉग

यह ब्राउज़र समर्थन के बारे में बात करता है, लेकिन अधिक महत्वपूर्ण बात यह है कि इसे सुरक्षित रूप से कैसे निपटा जाए:

function isStrictMode(){
    return !this;
} 
/*
   returns false, since 'this' refers to global object and 
   '!this' becomes false
*/

function isStrictMode(){   
    "use strict";
    return !this;
} 
/* 
   returns true, since in strict mode the keyword 'this'
   does not refer to global object, unlike traditional JS. 
   So here, 'this' is 'undefined' and '!this' becomes true.
*/

116
मैं असहमत हूं। मुझे लगता है कि यह दिखाता है कि इसका बहुत उपयोगी क्यों है। संक्षेप में इसका मतलब है कि यह अपने कार्य को लौटाता है न किwindow
जेमी हटर

36
जब आप कभी उस विंडो को चाहते हैं जिसके साथ thisआप लक्षित नहीं कर सकते हैं window?
जेमी हटबर

14
यह खुद को संदर्भित करता है। thisअपने स्वयं के फ़ंक्शन के अंतर्गत आता है और वैश्विक विंडो में नहीं
जेमी हटर

26
दूसरे में एक thisवास्तव में है undefined
Broxzier

14
मुद्दा यह है कि वैश्विक वस्तु पर गलत काम करने के बजाय चुपचाप एक अपरिभाषित की संपत्ति तक पहुँचने के कारण आपका जेएस कार्यक्रम विफल होने लगेगा। नीचे सूक्ष्म कीड़े ट्रैकिंग बहुत आसान बनाता है।
स्टीफन चुंग

208

सतर्कता का एक शब्द, आप सभी हार्ड-चार्ज करने वाले प्रोग्रामर: "use strict"मौजूदा कोड पर लागू करना खतरनाक हो सकता है! यह बात कुछ फील-गुड, खुश-चेहरे वाले स्टिकर की नहीं है कि आप इसे 'बेहतर' बनाने के लिए कोड पर थप्पड़ मार सकते हैं। "use strict"प्रैग्म के साथ , ब्राउज़र यादृच्छिक स्थानों में अचानक उन अपवादों को समाप्त कर देगा जो पहले कभी नहीं फेंके क्योंकि उस स्थान पर आप कुछ ऐसा कर रहे हैं जो कि डिफ़ॉल्ट रूप से / ढीला जावास्क्रिप्ट खुशी से अनुमति देता है लेकिन सख्त जावास्क्रिप्ट abhors! आपके कोड में शायद ही कभी उपयोग किए गए कॉल में छिपने पर आपको सख्ती से उल्लंघन हो सकता है जो केवल एक अपवाद को फेंक देगा जब वे अंततः चलते हैं - कहते हैं, उत्पादन वातावरण में जो आपके भुगतान करने वाले ग्राहक उपयोग करते हैं!

यदि आप डुबकी लेने जा रहे हैं, तो "use strict"व्यापक इकाई परीक्षणों और कड़ाई से कॉन्फ़िगर किए गए JSHint निर्माण कार्य के साथ आवेदन करना एक अच्छा विचार है जो आपको कुछ विश्वास दिलाएगा कि आपके मॉड्यूल का कोई भी अंधेरा कोना नहीं है जो आपको बुरी तरह से उड़ा देगा। '' स्ट्रिक्ट मोड '' चालू। या, हे, यहाँ एक और विकल्प है: बस "use strict"अपने किसी भी विरासत कोड में न जोड़ें , यह शायद इस तरह से, ईमानदारी से सुरक्षित है। परिभाषा"use strict" तीसरे पक्ष के मॉड्यूल की तरह किसी भी मॉड्यूल के साथ जोड़ें या बनाए रखें।

मुझे लगता है कि भले ही यह एक जानलेवा जानवर हो, "use strict"अच्छी चीजें हो सकती हैं, लेकिन आपको इसे सही करना होगा। सख्त होने का सबसे अच्छा समय तब है जब आपका प्रोजेक्ट ग्रीनफील्ड है और आप स्क्रैच से शुरू कर रहे हैं। JSHint/JSLintसभी चेतावनियों और विकल्पों के साथ कॉन्फ़िगर करें जैसे कि आपकी टीम पेट कर सकती है, एक अच्छा बिल्ड / टेस्ट / एसेट सिस्टम डु पत्रिकाएं प्राप्त करें Grunt+Karma+Chai, और केवल इस तरह से अपने सभी नए मॉड्यूल को चिह्नित करना शुरू करें "use strict"। बहुत सारी त्रुटियों और चेतावनियों को ठीक करने के लिए तैयार रहें। सुनिश्चित करें कि यदि JSHint/JSLintकोई उल्लंघन करता है, तो सभी लोग बिल्ड को FAIL पर कॉन्फ़िगर करके गुरुत्वाकर्षण को समझते हैं ।

जब मैंने गोद लिया था तो मेरा प्रोजेक्ट ग्रीनफील्ड प्रोजेक्ट नहीं था "use strict"। नतीजतन, मेरा आईडीई लाल निशान से भरा है क्योंकि मेरे पास "use strict"मेरे आधे मॉड्यूल नहीं हैं, और जेएसहिंट इस बारे में शिकायत करते हैं। यह मेरे लिए एक अनुस्मारक है कि भविष्य में मुझे क्या करना चाहिए। मेरे सभी लापता "use strict"बयानों के कारण मेरा लक्ष्य लाल निशान मुक्त होना है , लेकिन अब वर्षों दूर है।


24
क्यों इस धागे में देवता हैं इसलिए "सख्त का उपयोग करें" के बारे में घुड़सवार? यह अन्यथा अच्छा काम करने के लिए जावास्क्रिप्ट में काम कर रहा है , क्योंकि यह अच्छा है! बस इसे कॉर्न फ्लेक्स पर चीनी की तरह कोड पर छिड़कें, एह? नहीं! खराब! "सख्त का उपयोग करें" सावधानी से इस्तेमाल किया जाना चाहिए, अधिमानतः केवल आपके द्वारा नियंत्रित किए जाने वाले कोड में यूनिट परीक्षण होते हैं जो सभी प्रमुख ब्राउज़रों के खिलाफ पास होते हैं और जो सभी कोड पथों का उपयोग करते हैं। आपको टेस्ट मिले? ठीक है, "सख्त का उपयोग करें" आपके लिए ठीक है, अपने आप को बाहर खटखटाएं।
DWoldrich

57
हाँ। जाहिर है "सख्त का उपयोग करें" उचित रूप से मान्य जावास्क्रिप्ट को तोड़ सकता है जो पहले नहीं टूटा है। लेकिन इससे पहले का कोड नहीं टूटना कोड के सही होने और जो होना चाहिए था उसके बराबर नहीं है। आमतौर पर अघोषित चर का संकेत एक टाइपो, आदि का संकेत देता है। सख्त का उपयोग करें आप इस प्रकार की त्रुटियों को पकड़ने की अनुमति देते हैं, और उम्मीद है कि आप उत्पादन कोड को जहाज करने से पहले।
जोस्टीन कोजनिग्सेन

5
... या अपने कोड पर अंतिम पास के हिस्से के रूप में "सख्त का उपयोग करें" लागू करें, सभी स्पष्ट समस्याओं को ठीक करें, सिकोड़ें, "अच्छा पर्याप्त है", फिर इसे उत्पादन के लिए बाहर ले जाएं :)
वोल्फ़ी इनु

13
व्यक्तिगत रूप से, मैं मौजूदा कोड में कभी नहीं / बहुत कम जोड़ता हूं "use strict";। कहा जा रहा है, मैं लगभग हमेशा इसका उपयोग करूँगा जब मैं खरोंच से नया कोड लिख रहा हूँ
मार्टिन

3
यदि आप पहले से ही JSLint का उपयोग कर रहे हैं, तो आपने संभवतः अधिकांश स्थानों को ठीक कर लिया है जहां "सख्त उपयोग करें" चीजों को तोड़ देगा, हालांकि।
जोनाथन कास्ट

179

उपयोग करने से 'use strict';अचानक आपका कोड बेहतर नहीं हो जाता।

जावास्क्रिप्ट सख्त मोड में एक विशेषता है ECMAScript 5 । आप अपनी स्क्रिप्ट / फ़ंक्शन के शीर्ष में यह घोषित करके सख्त मोड को सक्षम कर सकते हैं।

'use strict';

जब एक जावास्क्रिप्ट इंजन इस निर्देश को देखता है , तो यह एक विशेष मोड में कोड की व्याख्या करना शुरू कर देगा। इस मोड में, त्रुटियां तब डाली जाती हैं जब कुछ कोडिंग प्रथाओं को समाप्त किया जा सकता है जो संभावित बग का पता लगाते हैं (जो कि सख्त मोड के पीछे तर्क है)।

इस उदाहरण पर विचार करें:

var a = 365;
var b = 030;

संख्यात्मक शाब्दिकों को पूरा करने के लिए उनके जुनून में, डेवलपर के पास अनजाने में bएक अष्टक शाब्दिक के साथ प्रारंभिक चर है । गैर-सख्त मोड इसे एक संख्यात्मक शाब्दिक मान के साथ व्याख्या करेगा 24(आधार 10 में)। हालांकि, सख्त मोड एक त्रुटि फेंक देगा।

सख्त मोड में विशिष्टताओं की गैर-विस्तृत सूची के लिए, यह उत्तर देखें ।


मुझे कहां उपयोग करना चाहिए 'use strict';?

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

  • मेरे मौजूदा जावास्क्रिप्ट कोड में: शायद नहीं! यदि आपके मौजूदा जावास्क्रिप्ट कोड में ऐसे बयान हैं जो सख्त-मोड में निषिद्ध हैं, तो एप्लिकेशन बस टूट जाएगा। यदि आप सख्त मोड चाहते हैं, तो आपको अपने मौजूदा कोड को डिबग और सही करने के लिए तैयार रहना चाहिए। यही कारण है कि उपयोग 'use strict';करना आपके कोड को अचानक बेहतर नहीं बनाता है


मैं सख्त मोड का उपयोग कैसे करूं?

  1. 'use strict';अपनी स्क्रिप्ट के ऊपर एक स्टेटमेंट डालें :

    // File: myscript.js
    
    'use strict';
    var a = 2;
    ....

    ध्यान दें कि फ़ाइल में सब कुछ myscript.jsसख्त मोड में व्याख्या किया जाएगा।

  2. या, 'use strict';अपने फ़ंक्शन बॉडी के शीर्ष पर एक स्टेटमेंट डालें :

    function doSomething() {
        'use strict';
        ...
    }

    फ़ंक्शन के शाब्दिक दायरे में सब कुछ doSomethingसख्त मोड में व्याख्या किया जाएगा। लेक्सिकल स्कोप शब्द यहाँ महत्वपूर्ण है। उदाहरण के लिए, यदि आपका सख्त कोड किसी लाइब्रेरी के फ़ंक्शन को कॉल करता है जो सख्त नहीं है , तो केवल आपके कोड को सख्त मोड में निष्पादित किया जाता है, और जिसे फ़ंक्शन नहीं कहा जाता है। बेहतर स्पष्टीकरण के लिए इस उत्तर को देखें ।


क्या चीजें सख्त मोड में निषिद्ध हैं?

मुझे कई चीजों का वर्णन करने वाला एक अच्छा लेख मिला जो सख्त मोड में निषिद्ध हैं (ध्यान दें कि यह एक विशेष सूची नहीं है):

क्षेत्र

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

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

सख्त कोड के लाभों में से एक यह है कि इसे संसाधित करते समय YUI कंप्रेसर जैसे उपकरण बेहतर काम कर सकते हैं।

वैश्विक चर

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

वैश्विक रिसाव

ऐसी कई स्थितियाँ हैं, जो this वैश्विक वस्तु के लिए बाध्य हो सकती हैं । उदाहरण के लिए, यदि आप newकंस्ट्रक्टर फ़ंक्शन को कॉल करते समय उपसर्ग प्रदान करना भूल जाते हैं , तो कंस्ट्रक्टर thisवैश्विक ऑब्जेक्ट के लिए अप्रत्याशित रूप से बाध्य हो जाएगा, इसलिए एक नई ऑब्जेक्ट को इनिशियलाइज़ करने के बजाय, यह चुपचाप वैश्विक चर के साथ छेड़छाड़ करेगा। इन स्थितियों में, सख्त मोड बजाय बाध्य होगा thisकरने के लिए undefinedहै, जो निर्माता का कारण इजाजत दी त्रुटि और भी जल्दी पता लगाया जा बजाय एक अपवाद फेंकने के लिए, होगा।

शोरगुल की विफलता

जावास्क्रिप्ट में हमेशा केवल-पढ़ने के लिए गुण होते हैं, लेकिन जब तक कि ES5 के Object.createProperty फ़ंक्शन ने उस क्षमता को उजागर नहीं किया, तब तक आप उन्हें स्वयं नहीं बना सकते । यदि आपने एक रीड-ओनली प्रॉपर्टी के लिए एक मान असाइन करने का प्रयास किया, तो यह चुपचाप विफल हो जाएगा। असाइनमेंट से प्रॉपर्टी की वैल्यू नहीं बदलेगी, लेकिन आपका प्रोग्राम वैसे ही आगे बढ़ेगा। यह एक अखंडता खतरा है जो कार्यक्रमों को असंगत स्थिति में जाने का कारण बन सकता है। सख्त मोड में, केवल-पढ़ने के लिए गुण बदलने का प्रयास अपवाद छोड़ देगा।

अष्टभुजाकार

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

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

Et cetera

तर्कों छद्म सरणी ES5 में थोड़ा और सरणी-जैसा हो जाता है। सख्त मोड में, यह अपने को खो देता है calleeऔर caller गुण। यह argumentsबहुत सारे गोपनीय संदर्भ दिए बिना आपके अविश्वास कोड को पारित करना संभव बनाता है । साथ ही, argumentsफ़ंक्शन की संपत्ति समाप्त हो जाती है।

सख्त मोड में, फ़ंक्शन शाब्दिक में डुप्लिकेट कुंजियाँ एक सिंटैक्स त्रुटि उत्पन्न करेंगी। एक फ़ंक्शन में एक ही नाम के दो पैरामीटर नहीं हो सकते। एक फ़ंक्शन के एक पैरामीटर के समान नाम के साथ एक चर नहीं हो सकता है। एक फ़ंक्शन deleteअपने स्वयं के चर नहीं कर सकता । deleteगैर-कॉन्फ़िगर करने योग्य संपत्ति का प्रयास अब एक अपवाद फेंकता है। आदिम मान निहित नहीं हैं।


भविष्य के जावास्क्रिप्ट संस्करणों के लिए आरक्षित शब्द

ECMAScript 5 आरक्षित शब्दों की एक सूची जोड़ता है। यदि आप उन्हें चर या तर्क के रूप में उपयोग करते हैं, तो सख्त मोड एक त्रुटि फेंक देगा। आरक्षित शब्द हैं:

implements, interface, let, package, private, protected, public, static, औरyield


आगे की पढाई


2
यह बहुत अच्छी व्याख्या है। हालांकि, मुझे एक संदेह है कि क्या मैं अन्य जावा स्क्रिप्ट पुस्तकालयों के साथ संयोजन में "सख्त" मोड का उपयोग कर सकता हूं, जैसे कि कोणीय जीएस?
यूवीएम

3
@ वीवीएम: सख्त-मोड निर्देश केवल शाब्दिक गुंजाइश को प्रभावित करता है। यानी केवल फ़ाइल / फ़ंक्शन जिसे यह घोषित किया गया है। यदि आपके पास एक और फ़ाइल / फ़ंक्शन है जिसमें 'use strict'निर्देश नहीं है , तो उन्हें गैर-सख्त मोड में निष्पादित किया जाएगा, भले ही सख्त मोड में चल रहे फ़ंक्शन से कॉल किया गया हो। स्पष्टीकरण के लिए इस asnwer देखें ।
संपतश्री

यह पूरी तरह सही नहीं है। 'उपयोग सख्त' कोड को निष्पादित करने के तरीके को बदल देता है।
साइबरएड

3
दूसरी नज़र में, आप सही हैं। मुझे लगा कि आपका मतलब केवल अपवादों को फेंकना है, लेकिन कोड के काम करने के तरीके को बदलना नहीं था (जैसे बदलना this)। अब मैं देख रहा हूं कि आप अन्य कार्यों को कॉल करने की बात कर रहे हैं।
साइबरएड

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

138

मैं दृढ़ता से प्रत्येक डेवलपर को अब सख्त मोड का उपयोग शुरू करने की सलाह देता हूं। पर्याप्त ब्राउज़र हैं जो इसका समर्थन करते हैं कि सख्त मोड हमें उन त्रुटियों से बचाने में मदद करेगा जो हम नहीं जानते थे कि आपके कोड में भी थे।

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

उदाहरण के लिए,

var person = {
    name : 'xyz',
    position : 'abc',
    fullname : function () {  "use strict"; return this.name; }
};

JSLint डगलस क्रॉकफोर्ड द्वारा लिखित एक डिबगर है। बस अपनी स्क्रिप्ट में पेस्ट करें, और यह आपके कोड में किसी भी ध्यान देने योग्य मुद्दों और त्रुटियों के लिए जल्दी से स्कैन करेगा।


6
@JamieHutber: कृपया इस लिंक पर जाएं caniuse.com/use-strict और kangax.github.io/es5-compat-table । यह सभी ब्राउज़र के लिए सटीक विचार देगा।
पंक

95

मैं अन्य उत्तरों के पूरक के रूप में कुछ हद तक स्थापित उत्तर देना चाहूंगा। मैं सबसे लोकप्रिय उत्तर को संपादित करने की उम्मीद कर रहा था, लेकिन असफल रहा। मैंने इसे जितना हो सके उतना व्यापक और पूर्ण बनाने की कोशिश की।

अधिक जानकारी के लिए आप MDN प्रलेखन का उल्लेख कर सकते हैं ।

"use strict" ECMAScript 5 में एक निर्देश शुरू किया गया।

निर्देश कथन के समान हैं, फिर भी भिन्न हैं।

  • use strictइसमें मुख्य शब्द नहीं हैं: निर्देश एक सरल अभिव्यक्ति कथन है, जिसमें एक विशेष स्ट्रिंग शाब्दिक (एकल या दोहरे उद्धरण में) शामिल हैं। जावास्क्रिप्ट इंजन, जो ECMAScript 5 को लागू नहीं करते हैं, केवल साइड इफेक्ट्स के बिना एक अभिव्यक्ति स्टेटमेंट देखते हैं। यह उम्मीद की जाती है कि ECMAScript मानकों के भविष्य के संस्करण useएक वास्तविक कुंजी शब्द के रूप में पेश होते हैं ; इस प्रकार उद्धरण अप्रचलित हो जाएंगे।
  • use strictकेवल एक स्क्रिप्ट या एक समारोह की शुरुआत में इस्तेमाल किया जा सकता है, यानी यह हर दूसरे (वास्तविक) बयान से पहले होना चाहिए। यह फ़ंक्शन की एक स्क्रिप्ट में पहला निर्देश नहीं है: यह अन्य कथन अभिव्यक्तियों से पहले हो सकता है जिसमें स्ट्रिंग शाब्दिक शामिल हैं (और जावास्क्रिप्ट कार्यान्वयन उन्हें विशिष्ट निर्देशों के रूप में लागू कर सकते हैं)। स्ट्रिंग के शाब्दिक कथन, जो पहले वास्तविक कथन का अनुसरण करते हैं (स्क्रिप्ट या फ़ंक्शन में) सरल अभिव्यक्ति कथन हैं। दुभाषियों को उन्हें निर्देशों के रूप में व्याख्या नहीं करनी चाहिए और उनका कोई प्रभाव नहीं है।

use strictनिर्देश इंगित करता है कि निम्नलिखित कोड (एक स्क्रिप्ट या एक समारोह में) सख्त कोड है। किसी स्क्रिप्ट के उच्चतम स्तर में कोड (एक फ़ंक्शन में कोड नहीं है) को सख्त कोड माना जाता है जब स्क्रिप्ट में एक use strictनिर्देश होता है । किसी फ़ंक्शन की सामग्री को सख्त कोड माना जाता है जब फ़ंक्शन स्वयं को एक सख्त कोड में परिभाषित करता है या जब फ़ंक्शन में एक use strictनिर्देश होता है । एक eval()विधि में पारित कोड को सख्त कोड माना eval()जाता है जब एक सख्त कोड से बुलाया गया था या इसमें use strictस्वयं निर्देश शामिल है।

ECMAScript 5 का सख्त मोड जावास्क्रिप्ट भाषा का एक सीमित उपसमूह है, जो भाषा के प्रासंगिक घाटे को समाप्त करता है और अधिक कठोर त्रुटि जाँच और उच्च सुरक्षा की सुविधा देता है। निम्नलिखित सख्त मोड और सामान्य मोड के बीच अंतर को सूचीबद्ध करता है (जिनमें से पहले तीन विशेष रूप से महत्वपूर्ण हैं):

  • आप with-statement का उपयोग सख्त मोड में नहीं कर सकते ।
  • सख्त मोड में सभी चर घोषित किए जाने हैं: यदि आप किसी ऐसे पहचानकर्ता को मान देते हैं जिसे चर, फ़ंक्शन, फ़ंक्शन पैरामीटर, कैच-क्लॉज पैरामीटर या वैश्विक की संपत्ति के रूप में घोषित नहीं किया गया है Object, तो आपको ए ReferenceError। सामान्य मोड में पहचानकर्ता को स्पष्ट रूप से एक वैश्विक चर के रूप में घोषित किया जाता है (वैश्विक संपत्ति के रूप में Object)
  • सख्त मोड में कीवर्ड के फंक्शंस में thisवैल्यू undefinedहोती है जिसे फंक्शन्स के रूप में (फंक्शन्स के तौर पर नहीं) फंक्शन के तौर पर लिया जाता है। (सामान्य मोड में thisहमेशा वैश्विक की ओर इशारा करता है Object)। यह अंतर परीक्षण के लिए इस्तेमाल किया जा सकता है अगर कोई कार्यान्वयन सख्त मोड का समर्थन करता है:
var hasStrictMode = (function() { "use strict"; return this===undefined }());
  • इसके अलावा जब किसी फ़ंक्शन को सख्त मोड में call()या applyउसके साथ लागू किया जाता है, तो thisयह वास्तव में call()या तर्क के पहले तर्क का मूल्य है apply()। (सामान्य मोड में nullऔर undefinedवैश्विक Objectऔर मूल्यों द्वारा प्रतिस्थापित किया जाता है , जो ऑब्जेक्ट नहीं हैं, वस्तुओं में डाली जाती हैं।)

  • सख्त मोड में आपको मिलेगा TypeError, जब आप आसानी से पढ़ने के लिए या गैर-एक्स्टेंसिबल ऑब्जेक्ट के लिए नए गुणों को परिभाषित करने का प्रयास करते हैं। (सामान्य मोड में दोनों बिना त्रुटि संदेश के विफल हो जाते हैं।)

  • सख्त मोड में, कोड को पास करते समय eval(), आप कॉलर के दायरे में चर या कार्यों को घोषित या परिभाषित नहीं कर सकते हैं (जैसा कि आप इसे सामान्य मोड में कर सकते हैं)। इसके बजाय, एक नया दायरा बनाया जाता है eval()और चर और कार्य उस दायरे के भीतर होते हैं। eval()निष्पादन खत्म होने के बाद यह गुंजाइश नष्ट हो जाती है ।
  • सख्त मोड में किसी फ़ंक्शन के तर्कों-ऑब्जेक्ट में मानों की एक स्थिर प्रतिलिपि होती है, जो उस फ़ंक्शन को दी जाती है। सामान्य मोड में तर्कों-ऑब्जेक्ट में कुछ "जादुई" व्यवहार होता है: सरणी के तत्व और नामित फ़ंक्शन पैरामीटर दोनों समान मान को संदर्भित करते हैं।
  • सख्त मोड में आपको SyntaxErrorतब मिलेगा जब deleteऑपरेटर को एक गैर योग्य पहचानकर्ता (एक चर, फ़ंक्शन या फ़ंक्शन पैरामीटर) द्वारा पीछा किया जाता है। सामान्य मोड में deleteअभिव्यक्ति कुछ नहीं करेगी और इसका मूल्यांकन किया जाता है false
  • सख्त मोड में आपको TypeErrorतब मिलेगा जब आप एक गैर-विन्यास संपत्ति को हटाने की कोशिश करेंगे । (सामान्य मोड में प्रयास बस विफल हो जाता है और deleteअभिव्यक्ति का मूल्यांकन किया जाता है false)।
  • जब आप एक वस्तु शाब्दिक के लिए एक ही नाम के साथ कई गुणों को परिभाषित करने का प्रयास करते हैं, तो सख्त मोड में इसे एक वाक्यात्मक त्रुटि माना जाता है। (सामान्य मोड में कोई त्रुटि नहीं है।)
  • सख्त मोड में इसे एक सिंटैक्टिकल त्रुटि माना जाता है जब एक फ़ंक्शन घोषणा में एक ही नाम के साथ कई पैरामीटर होते हैं। (सामान्य मोड में कोई त्रुटि नहीं है।)
  • सख्त मोड में ऑक्टल शाब्दिक अनुमति नहीं दी जाती है (ये ऐसे शाब्दिक हैं जो कि शुरू होते हैं 0x। (सामान्य मोड में कुछ कार्यान्वयन ऑक्टल शाब्दिक अनुमति देते हैं।)
  • सख्त मोड में पहचानकर्ता evalऔर argumentsकीवर्ड की तरह व्यवहार किया जाता है। आप उनका मान नहीं बदल सकते, उनके लिए कोई मान निर्दिष्ट नहीं कर सकते, और आप उन्हें चर, फ़ंक्शन, फ़ंक्शन पैरामीटर या कैच ब्लॉक के पहचानकर्ता के नाम के रूप में उपयोग नहीं कर सकते।
  • सख्त मोड में कॉल स्टैक की जांच करने की संभावनाओं पर अधिक प्रतिबंध हैं। arguments.callerऔर सख्त मोड में फ़ंक्शन के arguments.calleeकारण होता TypeErrorहै। इसके अलावा, कुछ कॉलर- और सख्त मोड में कार्यों के तर्क गुण TypeErrorजब आप उन्हें पढ़ने की कोशिश करते हैं।

4
"सख्त मोड में अष्टक शाब्दिकों की अनुमति नहीं है (ये ऐसे शाब्दिक हैं जो 0x से शुरू होते हैं ...)" अष्ट शाब्दिक एक अग्रणी के साथ शुरू होते हैं 0
एलेक्स गिट्टेमियर 19

83

मेरे दो सेंट:

सख्त मोड के लक्ष्यों में से एक है मुद्दों की तेजी से डिबगिंग के लिए अनुमति देना। जब कुछ गलत चीजें होती हैं जो आपके वेबपेज के मौन और अजीब व्यवहार का कारण बन सकती हैं, तो यह अपवादों को फेंकने में डेवलपर्स की मदद करता है। जिस क्षण हम उपयोग करते हैं use strict, कोड त्रुटियों को बाहर निकाल देगा जो डेवलपर को इसे पहले से ठीक करने में मदद करता है।

कुछ महत्वपूर्ण चीजें जो मैंने उपयोग करने के बाद सीखी हैं use strict:

वैश्विक परिवर्तनीय घोषणा को रोकता है:

var tree1Data = { name: 'Banana Tree',age: 100,leafCount: 100000};

function Tree(typeOfTree) {
    var age;
    var leafCount;

    age = typeOfTree.age;
    leafCount = typeOfTree.leafCount;
    nameoftree = typeOfTree.name;
};

var tree1 = new Tree(tree1Data);
console.log(window);

अब, यह कोड nameoftreeवैश्विक दायरे में बनाता है जिसे उपयोग करके एक्सेस किया जा सकता है window.nameoftree। जब हम use strictकोड लागू करते हैं तो त्रुटि होती है।

बिना संदर्भित संदर्भ: नाम-पत्र को परिभाषित नहीं किया गया है

Sample

withबयान को समाप्त करता है:

withविवरणों का उपयोग क्रमानुसार- js जैसे औजारों से नहीं किया जा सकता है । उन्हें भी हटा दिया गया है और भविष्य के जावास्क्रिप्ट संस्करणों से हटा दिया गया है।

Sample

डुप्लिकेट रोकता है:

जब हमारे पास डुप्लिकेट प्रॉपर्टी होती है, तो यह एक अपवाद फेंकता है

बिना सिंटैक्स ई-कार्ड: वस्तु शाब्दिक में डुप्लिकेट डेटा संपत्ति को सख्त मोड में अनुमति नहीं दी गई है

"use strict";
var tree1Data = {
    name: 'Banana Tree',
    age: 100,
    leafCount: 100000,
    name:'Banana Tree'
};

कुछ और हैं लेकिन मुझे उस पर और अधिक ज्ञान प्राप्त करने की आवश्यकता है।


ECMAScript 2015 के साथ डुप्लिकेट प्रॉपर्टी के नामों की फिर से अनुमति है! MDN प्रलेखन देखें ।
दर्शनमूल

62

यदि आप पिछले वर्ष या उसके बाद रिलीज़ किए गए ब्राउज़र का उपयोग करते हैं, तो यह जावास्क्रिप्ट स्ट्रिक्ट मोड का सबसे अधिक समर्थन करता है। ECMAScript 5 से पहले केवल पुराने ब्राउज़र ही वर्तमान मानक का समर्थन करते हैं।

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


12
फिर यह क्या करता है?
अनीश गुप्ता

7
... इस भाग में संगतता का वर्णन है , लेकिन यह वास्तव में क्या नहीं करता है।
कोर्टिमेस

58

जोड़ते समय "use strict";, निम्नलिखित मामले स्क्रिप्ट निष्पादित होने से पहले एक सिंटेक्सऑयर को फेंक देंगे :

  • भविष्य ECMAScript संस्करणों का मार्ग प्रशस्त , (पूर्वज्ञान में के लिए हाल में सुरक्षित कीवर्ड का उपयोग कर ECMAScript 6 ): implements, interface, let, package, private, protected, public, static, और yield

  • ब्लॉक में समारोह की घोषणा

    if(a<b){ function f(){} }
  • अष्टक वाक्य रचना

    var n = 023;
  • this वैश्विक वस्तु की ओर इशारा।

     function f() {
          "use strict";
          this.a = 1;
     };
     f(); 
  • एक वस्तु शाब्दिक में एक संपत्ति के नाम के लिए एक ही नाम की दो बार घोषणा

     {a: 1, b: 3, a: 7} 

    ECMAScript 6 ( बग 1041128 ) में ऐसा नहीं है।

  • समान नाम फ़ंक्शन के साथ दो फ़ंक्शन तर्क की घोषणा करना

    f(a, b, b){}
  • एक अघोषित चर का मान सेट करना

    function f(x){
       "use strict";
       var a = 12;
       b = a + x*35; // error!
    }
    f();
  • deleteएक चर नाम पर उपयोग करनाdelete myVariable;

  • का उपयोग करना evalया argumentsके रूप में चर या समारोह तर्क नाम

    "use strict";
    arguments++;
    var obj = { set p(arguments) { } };
    try { } catch (arguments) { }
    function arguments() { } 

सूत्रों का कहना है:


ECMAScript 2015 के साथ डुप्लिकेट प्रॉपर्टी के नामों की फिर से अनुमति है! MDN प्रलेखन देखें ।
दर्शनमूल

53

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

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

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

  • ECMAScript के भविष्य के संस्करणों में कुछ वाक्यविन्यास को परिभाषित किए जाने की संभावना है।

अधिक जानकारी के लिए vistit स्ट्रिक्ट मोड- जावास्क्रिप्ट


52

"स्ट्रिक्ट यूज़"; एक बीमा है जो प्रोग्रामर जावास्क्रिप्ट के ढीले या बुरे गुणों का उपयोग नहीं करेगा। यह एक मार्गदर्शक है, जैसे एक शासक आपको सीधी रेखा बनाने में मदद करेगा। "स्ट्रिक्ट स्ट्रिक्ट" आपको "स्ट्रेट कोडिंग" करने में मदद करेगा।

जो लोग अपनी पंक्तियों को सीधे करने के लिए शासकों का उपयोग नहीं करना पसंद करते हैं, वे आमतौर पर उन पृष्ठों में समाप्त होते हैं, जो दूसरों से अपने कोड को डीबग करने के लिए कहते हैं।

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

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


66
सख्त मोड वैकल्पिक होने के कारण आपके द्वारा बताई गई बातों से कोई लेना-देना नहीं है। असली कारण मौजूदा कोड को नहीं तोड़ना है जो अनुरूप नहीं हो सकता है
डेक्‍सीजन

17
वास्तव में, कम अनुभवी कॉडर्स को "सख्त का उपयोग करने" को सक्षम करने वाले पहले व्यक्ति होने चाहिए ;
एंटटी हापाला

46

use strictइस बिंदु से आपकी सभी संवेदनशील जावास्क्रिप्ट फ़ाइलों की शुरुआत में शामिल करना एक बेहतर जावास्क्रिप्ट प्रोग्रामर बनने का एक छोटा तरीका है और यादृच्छिक वैरिएबल के वैश्विक बनने से बचें और चीजें चुपचाप बदल जाती हैं।


42

W3schools से उद्धरण :

"सख्त का उपयोग करें" निर्देश

"सख्त उपयोग" निर्देश जावास्क्रिप्ट 1.8.5 (ECMAScript संस्करण 5) में नया है।

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

"सख्त का उपयोग करें" का उद्देश्य यह इंगित करना है कि कोड को "सख्त मोड" में निष्पादित किया जाना चाहिए।

सख्त मोड के साथ, आप उदाहरण के लिए, अघोषित चर का उपयोग नहीं कर सकते।

क्यों सख्त मोड?

सख्त मोड "सुरक्षित" जावास्क्रिप्ट लिखना आसान बनाता है।

सख्त मोड पहले "खराब सिंटैक्स" को वास्तविक त्रुटियों में स्वीकार करता है।

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

सामान्य जावास्क्रिप्ट में, एक डेवलपर को गैर-लेखन योग्य गुणों के लिए मान निर्दिष्ट करने में कोई त्रुटि प्रतिक्रिया नहीं मिलेगी।

सख्त मोड में, एक गैर-लिखने योग्य संपत्ति के लिए कोई असाइनमेंट, एक गेट-ओनली प्रॉपर्टी, एक गैर-मौजूदा प्रॉपर्टी, एक गैर-मौजूदा वैरिएबल या एक गैर-मौजूदा ऑब्जेक्ट, एक त्रुटि फेंक देगा।

अधिक जानने के लिए कृपया http://www.w3schools.com/js/js_strict.asp देखें


37

"use strict"जावास्क्रिप्ट कोड को सख्त मोड में चलाने के लिए बनाता है , जिसका मूल रूप से उपयोग करने से पहले सब कुछ परिभाषित करने की आवश्यकता है। सख्त मोड का उपयोग करने का मुख्य कारण अपरिभाषित तरीकों के आकस्मिक वैश्विक उपयोग से बचना है।

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

"use strict"ECMA5 में व्यापक रूप से उपयोग करने की आवश्यकता है, ECMA6 में यह डिफ़ॉल्ट रूप से जावास्क्रिप्ट का हिस्सा है , इसलिए यदि आपको ES6 का उपयोग कर रहे हैं तो इसे जोड़ने की आवश्यकता नहीं है।

एमडीएन से इन बयानों और उदाहरणों को देखें:

"सख्त का उपयोग करें" निर्देश
उपयोग करें" निर्देश "सख्त उपयोग करें" निर्देश जावास्क्रिप्ट 1.8.5 (ECMAScript संस्करण 5) में नया है। यह एक बयान नहीं है, बल्कि एक शाब्दिक अभिव्यक्ति है, जिसे जावास्क्रिप्ट के पुराने संस्करणों द्वारा अनदेखा किया गया है। "सख्त का उपयोग करें" का उद्देश्य यह इंगित करना है कि कोड को "सख्त मोड" में निष्पादित किया जाना चाहिए। सख्त मोड के साथ, आप उदाहरण के लिए, अघोषित चर का उपयोग नहीं कर सकते।

"उपयोग सख्त" का उपयोग करने के उदाहरण:
कार्यों के लिए सख्त मोड: इसी तरह, एक फ़ंक्शन के लिए सख्त मोड को लागू करने के लिए, सटीक कथन "सख्त उपयोग करें"; (या 'सख्त का उपयोग करें') किसी भी अन्य बयान से पहले फ़ंक्शन के शरीर में।

1) कार्यों में सख्त मोड

 function strict() {
     // Function-level strict mode syntax
     'use strict';
     function nested() { return 'And so am I!'; }
     return "Hi!  I'm a strict mode function!  " + nested();
 }
 function notStrict() { return "I'm not strict."; }

 console.log(strict(), notStrict());

2) पूरी-स्क्रिप्ट सख्त मोड

'use strict';
var v = "Hi! I'm a strict mode script!";
console.log(v);

3) एक गैर-लेखन वैश्विक के लिए असाइनमेंट

'use strict';

// Assignment to a non-writable global
var undefined = 5; // throws a TypeError
var Infinity = 5; // throws a TypeError

// Assignment to a non-writable property
var obj1 = {};
Object.defineProperty(obj1, 'x', { value: 42, writable: false });
obj1.x = 9; // throws a TypeError

// Assignment to a getter-only property
var obj2 = { get x() { return 17; } };
obj2.x = 5; // throws a TypeError

// Assignment to a new property on a non-extensible object.
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = 'ohai'; // throws a TypeError

आप MDN पर अधिक पढ़ सकते हैं


31

ECMAScript समिति पर कुछ लोगों द्वारा एक अच्छी बात की गई है: परिवर्तन के लिए जावास्क्रिप्ट, भाग 1: ECMAScript 5 " कैसे वृद्धिशील उपयोग के बारे में ""use strict" स्विच के जावास्क्रिप्ट कार्यान्वयनकर्ता जावास्क्रिप्ट की बहुत सारी खतरनाक विशेषताओं को साफ करने की अनुमति देते हैं, जो अचानक हर वेबसाइट को तोड़ते हैं। दुनिया में।

निश्चित रूप से यह सिर्फ इस बारे में बात करता है कि उनमें से कितने मिसफिट हैं (हैं) और कैसे ECMAScript 5 उन्हें ठीक करता है।


27

तुलना करने के लिए छोटे उदाहरण:

गैर-सख्त मोड:

for (i of [1,2,3]) console.log(i)
    
// output:
// 1
// 2
// 3

सख्त मोड:

'use strict';
for (i of [1,2,3]) console.log(i)

// output:
// Uncaught ReferenceError: i is not defined

गैर-सख्त मोड:

String.prototype.test = function () {
  console.log(typeof this === 'string');
};

'a'.test();

// output
// false

String.prototype.test = function () {
  'use strict';
  
  console.log(typeof this === 'string');
};

'a'.test();

// output
// true


2
ध्यान दें कि उपरोक्त कोड i वैरिएबल को वैश्विक दायरे में जोड़ देगा (आमतौर पर यह एक सर्वोत्तम अभ्यास नहीं है और सख्त मोड इससे बचने में मदद करता है)।
माइकेल

1
क्या कोई दूसरा उदाहरण समझा सकता है? मुझे नहीं मिला। this === 'a'दोनों उदाहरणों में नहीं होना चाहिए ?
मैक्सिमडब्ल्यू

19

नोट जो EcmaScript 5use strict में पेश किया गया था और तब से रखा गया था।

नीचे ES6 और ES7 में सख्त मोड को ट्रिगर करने की शर्तें हैं :

  • वैश्विक कोड सख्त मोड कोड है यदि यह एक निर्देश प्रस्ताव के साथ शुरू होता है जिसमें एक उपयोग सख्त निर्देश होता है (देखें 14.1.1)।
  • मॉड्यूल कोड हमेशा सख्त मोड कोड होता है।
  • एक के सभी भागों ClassDeclaration या एक ClassExpression सख्त मोड कोड है।
  • Eval कोड सख्त मोड कोड होता है यदि यह एक डाइरेक्टिव प्रोलॉग के साथ शुरू होता है जिसमें एक यूज़ सख्त निर्देश होता है या यदि कॉल करने के लिए eval एक डायरेक्ट इवेल होता है (देखें 12.3.4.1) जो कि सख्त मोड कोड में निहित है।
  • फंक्शन कोड सख्त मोड कोड है यदि संबंधित फ़ंक्शनडेकेलरेशन, फंक्शनएक्सप्रेशन, जेनरेटर डिक्लेरेशन, जेनरेटरएक्सप्रेशन, मेथडिफिनिशन, या एरोफंक्शन सख्त मोड कोड में समाहित है या यदि कोड जो फ़ंक्शन के [[ECMAScriptCode]] आंतरिक स्लॉट को एक डाइरेक्टिव प्रोग्लॉग के साथ शुरू करता है। जिसमें एक यूज सख्त निर्देश है।
  • समारोह कोड है कि अगर अंतिम तर्क एक स्ट्रिंग है कि जब संसाधित एक है में निर्मित समारोह और जेनरेटर कंस्ट्रक्टर्स है सख्त मोड कोड को तर्क के रूप में आपूर्ति की है FunctionBody है कि एक निर्देशक प्रस्तावना है कि एक का प्रयोग करें सख्त निर्देशक शामिल साथ शुरू होता है।

14

डेवलपर्स का उपयोग क्यों करना चाहिए इसके मुख्य कारण "use strict"हैं:

  1. वैश्विक चरों की आकस्मिक घोषणा को रोकता है । उपयोग "use strict()"करने varसे पहले यह सुनिश्चित कर लिया जाएगा कि चरों को घोषित किया गया है । उदाहरण के लिए:

    function useStrictDemo(){
     'use strict';
     //works fine
     var a = 'No Problem';
    
     //does not work fine and throws error
     k = "problem"
    
     //even this will throw error
     someObject = {'problem': 'lot of problem'};
    }
  2. नायब: "use strict"निर्देश केवल एक स्क्रिप्ट या एक समारोह की शुरुआत में मान्यता प्राप्त है।
  3. स्ट्रिंग "arguments"को एक चर के रूप में इस्तेमाल नहीं किया जा सकता है:

    "use strict";
    var arguments = 3.14;    // This will cause an error
  4. कीवर्ड के उपयोग को चर के रूप में प्रतिबंधित करेगा। उनका उपयोग करने की कोशिश करने से त्रुटियां होंगी।

संक्षेप में आपके कोड को कम त्रुटि वाला बना देगा और बदले में आपको अच्छा कोड लिख देगा।

इसके बारे में अधिक पढ़ने के लिए आप यहाँ देख सकते हैं ।


12

"सख्त का उपयोग करें"; जावास्क्रिप्ट को और अधिक मजबूत बनाने के लिए ECMA प्रयास है। यह जेएस में इसे कम से कम "सख्त" बनाने की कोशिश करता है (अन्य भाषाएं 90 के दशक से सख्त नियम लागू करती हैं)। यह वास्तव में "डेवलपर्स" जावास्क्रिप्ट डेवलपर्स को कुछ प्रकार के कोडिंग सर्वोत्तम प्रथाओं का पालन करने के लिए मजबूर करता है। फिर भी, जावास्क्रिप्ट बहुत नाजुक है। टाइप किए गए चर, टाइप किए गए तरीके आदि जैसी कोई चीज नहीं है। मैं जावा डेवलपर्स को सलाह देता हूं कि जावा या एक्शनस्क्रिप्ट 3 जैसी अधिक मजबूत भाषा सीखें, और अपने जावास्क्रिप्ट कोड में समान सर्वोत्तम प्रथाओं को लागू करें, यह बेहतर काम करेगा और आसान होगा डिबग।


12

ECMAScript 5 में जावास्क्रिप्ट "सख्त" मोड पेश किया गया था।

(function() {
  "use strict";
  your code...
})();

"use strict";आपकी जेएस फ़ाइल के शीर्ष पर लिखना सख्त वाक्यविन्यास जाँच पर निर्भर करता है। यह हमारे लिए निम्नलिखित कार्य करता है:

  1. यदि आप अघोषित चर को निर्दिष्ट करने का प्रयास करते हैं तो एक त्रुटि दिखाता है

  2. आपको जेएस सिस्टम लाइब्रेरी की ओवरराइटिंग से रोकता है

  3. कुछ असुरक्षित या त्रुटि-प्रवण भाषा सुविधाओं को मना करता है

use strictव्यक्तिगत कार्यों के अंदर भी काम करता है। use strictअपने कोड में शामिल करना हमेशा बेहतर अभ्यास होता है ।

ब्राउज़र संगतता समस्या: "उपयोग" निर्देश पीछे-संगत होना है। ब्राउज़र जो उनका समर्थन नहीं करते हैं, वे केवल एक स्ट्रिंग शाब्दिक देखेंगे जो आगे संदर्भित नहीं है। इसलिए, वे इस पर से गुजरेंगे और आगे बढ़ेंगे।


12

use strictअपने कोड को सुरक्षित बनाने का एक तरीका है, क्योंकि आप खतरनाक सुविधाओं का उपयोग नहीं कर सकते हैं जो आपकी अपेक्षा के अनुरूप काम नहीं कर सकती हैं। और, जैसा कि पहले लिखा गया था, यह कोड को अधिक सख्त बनाता है।


11

Use Strict का उपयोग सामान्य और बार-बार होने वाली त्रुटियों को दिखाने के लिए किया जाता है ताकि इसे अलग तरह से संभाला जाए, और जिस तरह से जावा स्क्रिप्ट चलती है, ऐसे परिवर्तन निम्न प्रकार हैं:

  • आकस्मिक ग्लोबल्स को रोकता है

  • कोई नकल नहीं करता

  • के साथ समाप्त हो जाता है

  • इस ज़बरदस्ती को खत्म करता है

  • सुरक्षित निष्कासन ()

  • अपरिवर्तनीयों के लिए त्रुटियां

आप इस लेख को विवरण के लिए भी पढ़ सकते हैं


11

आम तौर पर, जावास्क्रिप्ट सख्त नियमों का पालन नहीं करता है, इसलिए त्रुटियों की संभावना बढ़ जाती है। उपयोग करने के बाद "use strict", जावास्क्रिप्ट कोड को अन्य प्रोग्रामिंग भाषाओं में नियमों का कड़ाई से पालन करना चाहिए जैसे कि टर्मिनेटर का उपयोग, आरंभीकरण से पहले घोषणा आदि।

यदि "use strict"उपयोग किया जाता है, तो नियमों के एक सख्त सेट का पालन करके कोड लिखा जाना चाहिए, इसलिए त्रुटियों और अस्पष्टता की संभावना कम हो जाती है।


7

"सख्त का उपयोग करें"; परिभाषित करता है कि जावास्क्रिप्ट कोड को "सख्त मोड" में निष्पादित किया जाना चाहिए।

  • "उपयोग सख्त" निर्देश ECMAScript संस्करण 5 में नया था।
  • यह एक बयान नहीं है, बल्कि एक शाब्दिक अभिव्यक्ति है, जिसे जावास्क्रिप्ट के पुराने संस्करणों द्वारा अनदेखा किया गया है।
  • "सख्त का उपयोग करें" का उद्देश्य यह इंगित करना है कि कोड को "सख्त मोड" में निष्पादित किया जाना चाहिए।
  • सख्त मोड के साथ, आप उदाहरण के लिए, अघोषित चर का उपयोग नहीं कर सकते।

सभी आधुनिक ब्राउज़र इंटरनेट एक्सप्लोरर 9 और निचले को छोड़कर "सख्त उपयोग करें" का समर्थन करते हैं ।

हानि

यदि कोई डेवलपर किसी ऐसी लाइब्रेरी का उपयोग करता है जो सख्त मोड में थी, लेकिन डेवलपर का उपयोग सामान्य मोड में काम करने के लिए किया गया था, तो वे लाइब्रेरी पर कुछ कार्य कह सकते हैं जो अपेक्षा के अनुरूप काम नहीं करेंगे।

इससे भी बदतर, क्योंकि डेवलपर सामान्य मोड में है, उनके पास अतिरिक्त त्रुटियों को फेंकने के फायदे नहीं हैं, इसलिए त्रुटि चुपचाप विफल हो सकती है।

इसके अलावा, जैसा कि ऊपर सूचीबद्ध है, सख्त मोड आपको कुछ चीजें करने से रोकता है।

लोग आमतौर पर सोचते हैं कि आपको उन चीजों का उपयोग नहीं करना चाहिए, लेकिन कुछ डेवलपर्स को बाधा नहीं पसंद है और वे भाषा की सभी विशेषताओं का उपयोग करना चाहते हैं।


4

सख्त मोड मेमोरी लीक को रोक सकता है।

कृपया गैर-सख्त मोड में लिखे गए फ़ंक्शन को देखें:

function getname(){
    name = "Stack Overflow"; // Not using var keyword
    return name;
}
getname();
console.log(name); // Stack Overflow

इस फ़ंक्शन में, हम नामक एक वैरिएबल का उपयोग कर रहे हैं name फ़ंक्शन के अंदर । आंतरिक रूप से, कंपाइलर पहले जांच करेगा कि क्या उस विशेष फ़ंक्शन फ़ंक्शन में उस विशेष नाम के साथ घोषित कोई चर है। चूंकि संकलक समझ गया कि ऐसा कोई चर नहीं है, इसलिए यह बाहरी दायरे में जांच करेगा। हमारे मामले में, यह वैश्विक क्षेत्र है। फिर से, कंपाइलर समझ गया कि वैश्विक स्पेस में उस नाम के साथ कोई वेरिएबल घोषित नहीं है, इसलिए यह ग्लोबल स्पेस में हमारे लिए ऐसा वैरिएबल बनाता है। वैचारिक रूप से, यह वैरिएबल वैश्विक दायरे में बनाया जाएगा और पूरे एप्लिकेशन में उपलब्ध होगा।

एक अन्य परिदृश्य यह है कि, कहना है कि, चर एक बाल समारोह में घोषित किया गया है। उस स्थिति में, कंपाइलर बाहरी क्षेत्र में उस चर की वैधता की जाँच करता है, अर्थात, मूल कार्य। इसके बाद ही यह वैश्विक अंतरिक्ष में जांच करेगा और हमारे लिए एक वैरिएबल बनाएगा। इसका मतलब है कि अतिरिक्त जांच करने की जरूरत है। यह आवेदन के प्रदर्शन को प्रभावित करेगा।


अब उसी फ़ंक्शन को सख्त मोड में लिखें।

"use strict"
function getname(){
    name = "Stack Overflow"; // Not using var keyword
    return name;
}
getname();
console.log(name); 

हम निम्नलिखित त्रुटि प्राप्त करेंगे।

Uncaught ReferenceError: name is not defined
at getname (<anonymous>:3:15)
at <anonymous>:6:5

यहाँ, संकलक संदर्भ त्रुटि फेंकता है। सख्त मोड में, संकलक हमें घोषित किए बिना चर का उपयोग करने की अनुमति नहीं देता है। तो मेमोरी लीक को रोका जा सकता है। इसके अतिरिक्त, हम अधिक अनुकूलित कोड लिख सकते हैं।

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