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


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

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

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

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

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


6712
2017-08-26 16:10


मूल




जवाब:


जावास्क्रिप्ट सख्त मोड के बारे में यह आलेख आपको रूचि दे सकता है: जॉन रेसिग - ईसीएमएस्क्रिप्ट 5 सख्त मोड, जेएसओएन, और अधिक

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

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

तथा:

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

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

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

// Non-strict code...

(function(){
  "use strict";

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

// Non-strict code... 

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

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

वर्तमान में, यह है सभी प्रमुख ब्राउज़रों द्वारा समर्थित  (बार आईई 9 और नीचे)


4399
2017-08-26 16:15



इतने सालों के बाद डिफ़ॉल्ट बदल रहा है? इसके लिए बहुत देर हो चुकी है: यह इतनी सारी मौजूदा साइट्स / स्क्रिप्ट / एप्लिकेशन तोड़ देगा ... भविष्य के लिए चीजों को बेहतर बनाने में मदद करना एकमात्र संभव बात है। - Pascal MARTIN
मैंने एक छोटा कोड स्निपेट आज़माया जो उपयोग करते समय अमान्य होगा "use strict" फ़ायरफ़ॉक्स 3.6, सफारी 5, क्रोम 7 और ओपेरा 10.6 (सभी मैक) में। कोई त्रुटि नहीं, तो मुझे लगता है कि 'सख्त उपयोग करें' अभी तक किसी भी ब्राउज़र में समर्थित नहीं है। हालांकि आईई 9 में परीक्षण नहीं किया;) - Husky
त्वरित अपडेट: फ़ायरफ़ॉक्स 4 में सख्त मोड के लिए पूर्ण समर्थन है, और जहां तक ​​मैं कह सकता हूं, कोई अन्य ब्राउज़र नहीं करता है। सफारी और क्रोम के पास "आंशिक" समर्थन है, लेकिन मुझे वास्तव में पता नहीं है कि इसका क्या अर्थ है। - Sasha Chedygov
ऐसा लगता है कि क्रोम 11 इन सभी परीक्षणों को IE10 के रूप में पास करता है ie.microsoft.com/testdrive/HTML5/TryStrict/Default.html# - gman
@ जुलियस - यह आरक्षित कीवर्ड का उपयोग करके लागू नहीं किया जा सका, क्योंकि तब सख्त मोड को ट्रिगर करने का प्रयास करने वाले कोड पुराने ब्राउज़र में टूट जाएंगे। एक "यादृच्छिक" स्ट्रिंग अक्षर जोड़ना कुछ भी तोड़ नहीं देता है। - nnnnnn


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

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

"use strict";

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


1103
2017-08-26 16:14



तेजी से विफल और जोर से विफल। - Niels Bom
यदि आप HTML फ़ाइलों में जावास्क्रिप्ट इनलाइन लिख रहे हैं, तो प्रत्येक नए ब्लॉक को शुरू करें <script>"use strict";। ध्वज केवल उस ब्लॉक पर लागू होता है जिसमें इसे शामिल किया गया है। - nobar
यह मजाकिया है, जिसके परिणामस्वरूप तारों में सिंगल कोट्स होना चाहिए। तो लिखो 'use strict'; बजाय - nilsi
तो जावास्क्रिप्ट की उछाल की अवधारणा के साथ क्या होगा? - Sunil Sharma
@ सुनील शर्मा यदि आप उठाने की कोशिश करते हैं, लेकिन यह विफल रहता है क्योंकि चर परिभाषित नहीं किया गया है, इस समय यह इसे वैश्विक वस्तु में जोड़ देगा। साथ में "use strict";, यह बदले में असफल हो जाएगा। यह अधिक समझ में आता है, क्योंकि यदि यह वैश्विक ऑब्जेक्ट में जोड़ रहा है जिसका अर्थ यह है कि अगली बार जब आप फ़ंक्शन चलाते हैं / ब्लॉक को रीसेट करते हैं तो ऐसा कुछ भी नहीं कर सकता है, क्योंकि यह उच्चतम ब्लॉक (वैश्विक) में होगा। - wizzwizz4


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

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

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

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

  3. Undeletable गुणों को हटाने के प्रयास फेंक देंगे (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 समर्थित नहीं है

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


519
2017-11-24 21:22



नीट: वैश्विक चर की अनुमति है, बस स्पष्ट होना चाहिए (उदा। window.foo = bar)। - gcampbell
किसी ऑब्जेक्ट में सभी संपत्ति नामों को अक्षर के लिए शाब्दिक होना आवश्यक है (var x = {x1: "1", x1: "2"}) क्या यह मान्य है - Arun Killu
11 में आपके उदाहरण में एक संशोधन गुम है (अन्यथा यह कोई समझ नहीं आता है)। अर्थात। कार्य योग (ए, बी) {ए = 0; वापसी तर्क [0] + बी; } अलर्ट (योग (1, 2)) एलियासिंग के कारण, सख्त मोड के साथ 3 और सख्त मोड के बिना 2 लौटाएगा। - David Gausmann
आपने मुझे # 6 के साथ डिबगिंग के कुछ घंटों बचाए हैं - jazzcat


अगर लोग उपयोग करने के बारे में चिंतित हैं 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.
*/

369
2017-07-15 23:25



मैं असहमत हूं। मुझे लगता है कि यह दिखाता है कि यह बहुत उपयोगी क्यों है। संक्षेप में इसका मतलब है कि यह अपना कार्य देता है और नहीं window - Jamie Hutber
आप कभी खिड़की के साथ कब चाहते हैं this कि आप के साथ लक्षित नहीं कर सकते हैं window? - Jamie Hutber
यह खुद को संदर्भित करता है। this अपने स्वयं के कार्य से संबंधित है, न कि वैश्विक खिड़की - Jamie Hutber
दूसरे में this एक वास्तव में है undefined। - Broxzier
मुद्दा यह है कि आपका जेएस प्रोग्राम वैश्विक ऑब्जेक्ट पर चुपचाप गलत तरीके से करने के बजाय, एक अपरिभाषित की संपत्ति तक पहुंचने के कारण विफल होने लग जाएगा। सूक्ष्म बग को ट्रैक करना बहुत आसान बनाता है। - Stephen Chung


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

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

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

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


182
2018-03-03 07:37



इस धागे में देवता क्यों हैं "सख्त उपयोग" के बारे में cavalier ?? यह में छूट बढ़ जाती है अन्यथा जावास्क्रिप्ट काम कर रहा है, भलाई के लिए! बस इसे कॉर्न फ्लेक्स पर चीनी जैसे कोड पर छिड़काओ, आह? नहीं! खराब! "सख्त उपयोग करें" सावधानी से इस्तेमाल किया जाना चाहिए, अधिमानतः केवल उस कोड में जिसे आप नियंत्रित करते हैं जिसमें यूनिट परीक्षण होते हैं जो सभी प्रमुख ब्राउज़रों के खिलाफ गुजरते हैं और सभी कोड पथों का प्रयोग करते हैं। आपको परीक्षण मिल गए हैं? ठीक है, "सख्त उपयोग करें" आपके लिए ठीक है, खुद को खटखटाओ। - DWoldrich
हाँ। जाहिर है, "सख्त उपयोग करें" प्रतीत होता है कि वैध जावास्क्रिप्ट को तोड़ सकता है जो पहले टूट नहीं गया है। लेकिन पहले जो कोड टूटा नहीं गया है वह कोड के बराबर नहीं है और जो करना है उसे कर रहा है। आम तौर पर अविकसित चर के संदर्भ में एक टाइपो इत्यादि का संकेत मिलता है। सख्त उपयोग करने से आप इन प्रकार की त्रुटियों को पकड़ सकते हैं, और उम्मीद है कि आप उत्पादन कोड भेजने से पहले। - Jostein Kjønigsen
... या बस अपने कोड पर अंतिम पास के हिस्से के रूप में "सख्त उपयोग करें" लागू करें, सभी स्पष्ट समस्याओं को ठीक करें, शर्मिंदा करें, "पर्याप्त अच्छा" कहें, फिर उत्पादन के लिए इसे बाहर निकालें :) - Wolfie Inu
निजी तौर पर, मैं कभी भी / बहुत ही कम नहीं जोड़ना  "use strict"; मौजूदा कोड के लिए। ऐसा कहा जा रहा है, जब मैं स्क्रैच से नया कोड लिख रहा हूं, तो मैं लगभग हमेशा इसका उपयोग करूंगा - Martin
यदि आप पहले से ही जेएसलिंट का उपयोग कर रहे हैं, तो संभवतः आपने उन अधिकांश स्थानों को ठीक किया है जहां "सख्त उपयोग" चीजों को तोड़ देगा। - Jonathan Cast


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

जावास्क्रिप्ट सख्त मोड में एक सुविधा है ईसीएमएस्क्रिप्ट 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 सख्त मोड में व्याख्या की जाएगी। शब्द व्याख्यात्मक दायरा यहां महत्वपूर्ण है। देख यह जवाब एक बेहतर स्पष्टीकरण के लिए।


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

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

क्षेत्र

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

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

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

लागू ग्लोबल वैरिएबल

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

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

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

शोर असफलता

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

अष्टभुजाकार

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

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

एट कैटेरा

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

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


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

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

implements, interface, let, package, private, protected, public, static, तथा yield


आगे की पढाई


131
2018-01-29 11:35



यह बहुत अच्छा स्पष्टीकरण है। हालांकि, मुझे एक संदेह है कि क्या मैं अन्य जावा स्क्रिप्ट पुस्तकालयों, जैसे कोणीय जेएस के संयोजन के साथ "सख्त" मोड का उपयोग कर सकता हूं? - UVM
@UVM: सख्त-मोड निर्देश केवल व्याख्यात्मक दायरे को प्रभावित करता है। यानी केवल फाइल / फ़ंक्शन जिसे घोषित किया गया है। अगर आपके पास कोई अन्य फ़ाइल / फ़ंक्शन है जिसमें नहीं है 'use strict' निर्देश, वे सख्त मोड में चल रहे फ़ंक्शन से कॉल किए जाने पर भी गैर-सख्त मोड में निष्पादित किए जाएंगे। देख यह असर एक स्पष्टीकरण के लिए। - Krumia
आपके विवरण के लिये धन्यवाद। मैं समझता हूं कि "सख्त" मोड केवल "कोड" को प्रभावित करता है, न कि इसके "निष्पादन" - UVM
दूसरे देखो पर, आप सही हैं। मैंने सोचा था कि आप का मतलब है कि यह केवल अपवाद फेंक दिया, लेकिन कोड के काम को बदलने के तरीके को नहीं बदला (जैसे बदलना this)। अब मैं देखता हूं कि आप अन्य कार्यों को कॉल करने का जिक्र कर रहे थे। - CyberEd
ऐसे कुछ मामले हैं जहां ऑक्टल उपयोगी है। इसके लिए सी सिंटैक्स भयानक है, लेकिन मुझे लगता है कि भाषाओं को एक नया ऑक्टल वाक्यविन्यास जोड़ना पसंद होता जो बाद में शून्य-शून्य रूप को बहिष्कृत करने की अनुमति दे सकता था। बेशक, जावास्क्रिप्ट के लिए अग्रणी-शून्य रूप का समर्थन करने के लिए सिर्फ मूर्खतापूर्ण था। - supercat


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

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

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

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

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


122
2017-07-05 19:38



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


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

आप इसका उल्लेख कर सकते हैं एमडीएन दस्तावेज अधिक जानकारी के लिए।

"use strict" ईसीएमएस्क्रिप्ट 5 में पेश किया गया एक निर्देश।

निर्देश बयान के समान हैं, फिर भी अलग हैं।

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

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

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

  • आप उपयोग नहीं कर सकते हैं withसख्त मोड में -स्टेटमेंट।
  • सख्त मोड में सभी चर घोषित किए जाने चाहिए: यदि आप एक पहचानकर्ता को मान निर्दिष्ट करते हैं जिसे चर, फ़ंक्शन, फ़ंक्शन पैरामीटर, कैच-क्लॉज पैरामीटर या ग्लोबल की प्रॉपर्टी के रूप में घोषित नहीं किया गया है 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 जब आप उन्हें पढ़ने की कोशिश करते हैं।

81
2018-05-15 06:58



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