জাভাস্ক্রিপ্টে "কঠোর ব্যবহার" কী করে এবং এর পিছনে যুক্তি কী?


7545

সম্প্রতি, আমি ক্রকফোর্ডের জেএসলিন্টের মাধ্যমে আমার কিছু জাভাস্ক্রিপ্ট কোড চালিয়েছি এবং এটি নিম্নলিখিত ত্রুটিটি দিয়েছে:

লাইন 1 অক্ষর 1 এ সমস্যা: "কঠোর ব্যবহার" বিবৃতি অনুপস্থিত।

কিছু অনুসন্ধান করে, আমি বুঝতে পারি যে কিছু লোক "use strict";তাদের জাভাস্ক্রিপ্ট কোডটিতে যুক্ত করে। আমি একবার বিবৃতিটি যুক্ত করলে ত্রুটিটি উপস্থিত হওয়া বন্ধ হয়ে যায়। দুর্ভাগ্যক্রমে, গুগল এই স্ট্রিং স্টেটমেন্টের পিছনে অনেক ইতিহাস প্রকাশ করে নি। অবশ্যই জাভাস্ক্রিপ্টটিকে ব্রাউজার দ্বারা ব্যাখ্যা করার সাথে কিছু করার অবশ্যই আছে তবে এর প্রভাব কী হবে তা আমার কোনও ধারণা নেই।

সুতরাং "use strict";সমস্ত কি সম্পর্কে, এটি কি বোঝায় এবং এটি এখনও প্রাসঙ্গিক?

বর্তমান ব্রাউজারগুলির মধ্যে কেউ কি "use strict";স্ট্রিংটিতে সাড়া দেয় বা এটি ভবিষ্যতের ব্যবহারের জন্য?


5
এখানে উত্তরগুলি পুরানো তবে সেগুলি ভুল। কঠোর মোডের মূল যুক্তি ছিল প্রোগ্রামিং ত্রুটিগুলি রোধ করা নয় - এটি ছিল জাভাস্ক্রিপ্টকে বর্ণিতভাবে স্কোপযুক্ত করা যাতে এটি স্ট্যাটিকালি এনালাইজিবল হতে পারে:]
বেনজামিন গ্রুয়েনবুম

@ বেনজামিন গ্রুয়েনবাউম "use strict";একা ব্যবহার করা জেএসকে নমনীয়ভাবে বাদ দেয় না। এর সাথে ভেরিয়েবলগুলি ঘোষণা করা letএবং constএটিও ব্যবহার করা উচিত।
কুরোশ পাশোখি

আপনি ব্লক স্কোপিং এবং লেক্সিকাল স্কোপিংয়ের মধ্যে মেশাচ্ছেন।
বেনিয়ামিন গ্রুইনবাউম

উত্তর:


4936

জাভাস্ক্রিপ্ট স্ট্রাইক মোড সম্পর্কে এই নিবন্ধটি আপনার আগ্রহী হতে পারে: জন রেজিগ - ইসমাস্ক্রিপ্ট 5 স্ট্রাইক মোড, জেএসএন এবং আরও অনেক কিছু

কিছু আকর্ষণীয় অংশ উদ্ধৃত করতে:

স্ট্রিক্ট মোড ECMAScript 5 এ একটি নতুন বৈশিষ্ট্য যা আপনাকে একটি "কঠোর" অপারেটিং প্রসঙ্গে একটি প্রোগ্রাম বা কোনও ফাংশন রাখতে দেয়। এই কঠোর প্রসঙ্গটি নির্দিষ্ট পদক্ষেপ নেওয়া থেকে বাধা দেয় এবং আরও ব্যতিক্রম ছোঁড়ে।

এবং:

কড়া মোড কয়েকটি উপায় সাহায্য করে:

  • এটি ব্যতিক্রম ছুঁড়ে ফেলে কিছু সাধারণ কোডিং ব্লোপার ধরে।
  • তুলনামূলকভাবে "অনিরাপদ" পদক্ষেপ নেওয়া হলে (যেমন গ্লোবাল অবজেক্টে অ্যাক্সেস অর্জন করা) এটি ত্রুটিগুলি প্রতিরোধ করে বা ছুঁড়ে দেয়।
  • এটি এমন বৈশিষ্ট্যগুলি অক্ষম করে যা বিভ্রান্ত বা খারাপ চিন্তাভাবনা করে।

এছাড়াও নোট করুন আপনি পুরো ফাইলটিতে "কঠোর মোড" প্রয়োগ করতে পারেন ... বা আপনি এটি কেবল কোনও নির্দিষ্ট ফাংশনের জন্য ব্যবহার করতে পারেন (এখনও জন রেসিগের নিবন্ধ থেকে উদ্ধৃতি দিয়ে) :

// Non-strict code...

(function(){
  "use strict";

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

// Non-strict code... 

আপনার যদি পুরানো এবং নতুন কোড মিশ্রিত করতে হয় তবে এটি সহায়ক হতে পারে ;-)

সুতরাং, আমি অনুমান করি এটি "use strict"পার্লের (যেমন নামটি?) আপনি ব্যবহার করতে পারেন তার মতো কিছুটা : এটি আপনাকে আরও কম কিছু ভুল করতে সহায়তা করে, যাতে আরও বেশি কিছু ঘটতে পারে যা ভেঙে যেতে পারে detect

কঠোর মোড এখন সমস্ত বড় ব্রাউজার দ্বারা সমর্থিত

ইনসাইড নেটিভ নাম ECMAScript মডিউল (সঙ্গে importএবং exportবিবৃতি) এবং ES6 শ্রেণীর , কঠোর মোডে সর্বদা সক্ষম হয় এবং অক্ষম হতে পারে না।


100
এত বছর পরে কি ডিফল্ট পরিবর্তন হচ্ছে? এর জন্য খুব দেরী: এটি এতগুলি বিদ্যমান সাইট / স্ক্রিপ্ট / অ্যাপ্লিকেশনগুলি ভেঙে ফেলবে ... কেবলমাত্র সম্ভাব্য জিনিস হ'ল ভবিষ্যতের জন্য বিষয়গুলিকে আরও উন্নত করতে সহায়তা করা।
পাস্কাল মার্টিন

14
আমি একটি ছোট কোড স্নিপেট চেষ্টা করেছি যা "use strict"ফায়ারফক্স 3.6, সাফারি 5, ক্রোম 7 এবং অপেরা 10.6 (সমস্ত ম্যাক) ব্যবহার করার সময় অকার্যকর হবে । কোনও ত্রুটি নেই, সুতরাং আমার ধারণা 'কঠোর ব্যবহার' কোনও ব্রাউজারে এখনও সমর্থিত নয়। যদিও আই 9 তে পরীক্ষা করেনি;)
হস্কি

11
দ্রুত আপডেট: ফায়ারফক্স 4 এর কঠোর মোডের জন্য সম্পূর্ণ সমর্থন রয়েছে এবং আমি যতটা বলতে পারি, অন্য কোনও ব্রাউজার তা করে না। সাফারি এবং ক্রোমের "আংশিক" সমর্থন রয়েছে তবে এর অর্থ কী তা আমি সত্যিই জানি না।
সাশা চাদেগোভ

29
ক্রোম 11 যেমন করে IE10 এই পরীক্ষার সব পাস বলে মনে হয় ie.microsoft.com/testdrive/HTML5/TryStrict/Default.html#
gman

12
@ জুলিয়াস - এটি কোনও সংরক্ষিত কীওয়ার্ড ব্যবহার করে বাস্তবায়ন করা যেত না, কারণ তখন কঠোর মোডে ট্রিগার করার চেষ্টা করা কোডটি পুরানো ব্রাউজারগুলিতে বিভক্ত হয়ে যায়। একটি "এলোমেলো" স্ট্রিং আক্ষরিক যোগ করা কিছুতেই ভাঙবে না।
nnnnnn

1245

এটি ECMAScript এর একটি নতুন বৈশিষ্ট্য 5. জন রেসিগ এটির একটি দুর্দান্ত সংক্ষিপ্ত বিবরণ লিখেছিলেন ।

এটি আপনার জাভাস্ক্রিপ্ট ফাইলগুলিতে রাখা কেবল একটি স্ট্রিং (হয় আপনার ফাইলের শীর্ষে বা কোনও ফাংশনের অভ্যন্তরে) যা দেখতে এই রকম দেখাচ্ছে:

"use strict";

এটি এখন আপনার কোডে রাখার ফলে বর্তমান ব্রাউজারগুলিতে কোনও সমস্যা হওয়া উচিত নয় কারণ এটি কেবল একটি স্ট্রিং। ভবিষ্যতে আপনার কোডটি সমস্যা তৈরি করতে পারে যদি আপনার কোড প্রাগমা লঙ্ঘন করে। উদাহরণস্বরূপ, বর্তমানে যদি আপনি প্রথমে foo = "bar"সংজ্ঞা না দিয়ে থাকেন তবে fooআপনার কোডটি ব্যর্থ হতে শুরু করবে ... যা আমার মতে ভাল জিনিস।


328
দ্রুত ব্যর্থ এবং জোরে ব্যর্থ।
নীলস বোম

31
আপনি যদি এইচটিএমএল ফাইলগুলিতে জাভাস্ক্রিপ্ট ইনলাইন লিখছেন তবে প্রতিটি নতুন ব্লক দিয়ে শুরু করুন <script>"use strict";। পতাকাটি কেবলমাত্র সেই ব্লকটিতে প্রযোজ্য যেখানে এটি অন্তর্ভুক্ত রয়েছে।
নোটার

7
এটি মজার, এর ফলে স্ট্রিংগুলির অবশ্যই একক উদ্ধৃতি থাকা উচিত have সুতরাং 'use strict';পরিবর্তে লিখুন
নীলসি

1
তাহলে জাভাস্ক্রিপ্টের উত্তোলন ধারণার কী হবে?
সুনীল শর্মা

1
@ সুনীলশর্মা যদি আপনি উত্তোলনের চেষ্টা করেন তবে এটি ব্যর্থ হয় কারণ ভেরিয়েবলটি সংজ্ঞায়িত না করা হয়, এই মুহুর্তে এটি এটিকে বিশ্বজুড়ে যুক্ত করবে। সহ "use strict";, এটি পরিবর্তে ব্যর্থ হবে। এটি আরও অর্থবহ করে তোলে, কারণ এটি যদি এটি বিশ্বব্যাপী অবজেক্টে যুক্ত করে থাকে যার অর্থ এটি যখন পরবর্তী সময় আপনি ফাংশনটি চালাবেন / ব্লকটি পুনরায় সেট করে এমন কোনও কাজ করবেন যা এটি সর্বোচ্চ ব্লকে (গ্লোবাল) থাকবে।
wizzwizz4

646

বিবৃতিটি "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 সমর্থিত নয়

[রেফ: কঠোর মোড , মজিলা বিকাশকারী নেটওয়ার্ক ]


40
নীট: গ্লোবাল ভেরিয়েবলগুলি অনুমোদিত, কেবল স্পষ্টভাবে প্রকাশ করতে হবে (উদাঃ window.foo = bar)।
gcampbell

1
আক্ষরিক অর্থে অবজেক্টের সমস্ত সম্পত্তির নাম অনন্য হতে হবে (var x = {x1: "1", x1: "2"}) এটি বৈধ
অরুণ কিলু

4
11-এ আপনার উদাহরণটিতে একটির সংশোধন অনুপস্থিত (অন্যথায় এটি কোনও অর্থ দেয় না)। আই। ই। ফাংশন যোগফল (a, b) {a = 0; প্রত্যাবর্তন যুক্তি [0] + খ; } সতর্কতা (যোগফল (1, 2)) অ্যালিজিংয়ের কারণে কঠোর মোডে 3 এবং কঠোর মোড ছাড়াই 2 ফেরত আসবে।
ডেভিড গৌসমান

413

লোকেরা যদি use strictএটি ব্যবহার সম্পর্কে উদ্বিগ্ন থাকে তবে এই নিবন্ধটি পরীক্ষা করে দেখার মতো হতে পারে:

ECMAScript 5 ব্রাউজারগুলিতে 'স্ট্রিক্ট মোড' সমর্থন। এটার মানে কি?
নোভোজিক.কম - কৃষ্ণের ওয়েবলগ

এটি ব্রাউজার সমর্থন সম্পর্কে কথা বলেছে, তবে আরও গুরুত্বপূর্ণভাবে কীভাবে নিরাপদে এটি মোকাবেলা করতে হবে:

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
জেমি Hutber

36
আপনি কখন উইন্ডোটি দিয়ে thisলক্ষ্য করতে পারবেন না তা কখনই চান window?
জেমি হাটার

14
এটি নিজেকে বোঝায়। thisনিজস্ব ফাংশনের সাথে সম্পর্কিত এবং বৈশ্বিক উইন্ডোতে নয়
জেমি হুটার

26
দ্বিতীয়টিতে একটি thisআসলে undefined
ব্রক্সজিয়ার

14
মুল বক্তব্যটি হ'ল গ্লোবাল অবজেক্টে চুপচাপ ভুল কাজটি করার পরিবর্তে আপনার জেএস প্রোগ্রামটি অনির্ধারিত কোনও সম্পত্তি অ্যাক্সেসের কারণে ব্যর্থ হতে শুরু করবে। সূক্ষ্ম বাগগুলি ট্র্যাক করে রাখা আরও সহজ করে তোলে।
স্টিফেন চুং

208

সাবধানতার একটি শব্দ, আপনি সমস্ত হার্ড-চার্জিং প্রোগ্রামার: "use strict"বিদ্যমান কোডে প্রয়োগ করা বিপজ্জনক হতে পারে! এই জিনিসটি কিছু অনুভব করার মতো, শুভ-মুখের স্টিকার নয় যা আপনি কোডটিকে 'আরও ভাল' করতে চড় মারতে পারেন। সঙ্গে "use strict"pragma, ব্রাউজার হঠাৎ এটি মাত্র কারণ যে স্থানে আপনি কিছু করছেন ডিফল্ট / আলগা জাভাস্ক্রিপ্ট সুখে পারবেন না ছুড়ে ফেলে র্যান্ডম স্থানে ব্যতিক্রম কিন্তু কঠোর জাভাস্ক্রিপ্ট চরমভাবে ঘৃণা নিক্ষেপ করবে! আপনার কোডটিতে খুব কম ব্যবহৃত কলগুলিতে লুকিয়ে থাকা আপনার কঠোরতার লঙ্ঘন হতে পারে যা কেবল অবশেষে চালিত হয় তখনই ব্যতিক্রম হবে - বলুন, আপনার পরিবেশ প্রদানকারী পরিবেশে যা আপনার প্রদানকারী গ্রাহকরা ব্যবহার করেন!

আপনি যদি নিমজ্জন নিতে চলেছেন তবে "use strict"বিস্তৃত ইউনিট পরীক্ষার পাশাপাশি একটি কঠোরভাবে কনফিগার করা জেএসহিন্ট বিল্ড টাস্কের পাশাপাশি প্রয়োগ করা ভাল ধারণা যা আপনাকে কিছুটা আত্মবিশ্বাস দেবে যে আপনার মডিউলের কোনও অন্ধকার কোণ নেই যা ভয়াবহভাবে ফুঁ দিয়ে উঠবে কারণ আপনি কঠোর মোড চালু আছে। বা, আরে, এখানে আরও একটি বিকল্প রয়েছে: কেবলমাত্র "use strict"আপনার উত্তরাধিকারের কোডটিতে কোনও যোগ করবেন না , এটি সম্ভবত সেভাবেই নিরাপদ, সত্যই। অবশ্যই"use strict" তৃতীয় পক্ষের মডিউলগুলির মতো আপনার নিজের মালিকানাধীন বা রক্ষণাবেক্ষণের মতো কোনও মডিউল যুক্ত করবেন না

আমি মনে করি এটি একটি মারাত্মক খাঁচা প্রাণী "use strict"হলেও ভাল জিনিস হতে পারে তবে আপনাকে এটি সঠিকভাবে করতে হবে। আপনার প্রকল্পের গ্রিনফিল্ডটি যখন আপনি শুরু থেকে শুরু করছেন তখন কঠোর হওয়ার সবচেয়ে ভাল সময়। JSHint/JSLintআপনার দল যেমন পেট করতে পারে তত সংকুচিত সমস্ত সতর্কতা এবং বিকল্পগুলির সাথে কনফিগার করুন, ভাল বিল্ড / টেস্ট / জোর দেওয়া সিস্টেমের মতো ভ্রমণ করুন যেমন আপনার অন্ধ হয়ে গেছে Grunt+Karma+Chai, এবং কেবলমাত্র আপনার সমস্ত নতুন মডিউল চিহ্নিত করতে শুরু করুন "use strict"। প্রচুর কট্টর ত্রুটি এবং সতর্কতা নিরাময়ের জন্য প্রস্তুত থাকুন। যদি JSHint/JSLintকোনও লঙ্ঘনের সৃষ্টি হয় তবে সকলেই বিল্ড এফএআইএল কনফিগার করে মাধ্যাকর্ষণ বুঝতে পেরেছেন তা নিশ্চিত করুন ।

আমার প্রকল্পটি গ্রিনফিল্ড প্রকল্প ছিল না যখন আমি গ্রহণ করেছি "use strict"। ফলস্বরূপ, আমার আইডিই লাল চিহ্নগুলি পূর্ণ কারণ আমার "use strict"অর্ধেক মডিউলগুলি নেই এবং জেএসহিন্ট সে সম্পর্কে অভিযোগ করে। ভবিষ্যতে আমার কী রিফ্যাক্টরিং করা উচিত সে সম্পর্কে এটি আমার একটি অনুস্মারক। আমার নিখোঁজ সমস্ত "use strict"বক্তব্যের কারণে আমার লক্ষ্য লাল চিহ্ন মুক্ত হওয়া , তবে এটি এখন বহু বছর দূরে।


24
কেন এই থ্রেডে ডেভস এতটা অশ্বারোহী "কঠোর ব্যবহারের বিষয়ে"? সদ্ব্যবহারের জন্য এটি অন্যথায় জাভাস্ক্রিপ্টে কাজ করা ছাড় দেয় ! কর্ন ফ্লেক্সে চিনির মতো কোডটিতে এটি কেবল ছিটান, তাই না? না! খারাপ! "ব্যবহার কঠোর" সতর্কতার সাথে ব্যবহার করা উচিত, কেবলমাত্র আপনার নিয়ন্ত্রণের কোডেই এমন ইউনিট পরীক্ষা রয়েছে যা সমস্ত বড় ব্রাউজারগুলির বিরুদ্ধে যায় এবং যা সমস্ত কোড পাথকে ব্যবহার করে। আপনি পরীক্ষা পেয়েছেন? ঠিক আছে, "ব্যবহার কঠোর" আপনার পক্ষে ভাল, নিজেকে ছিটকে পড়ুন।
DWoldrich

57
হ্যাঁ. স্পষ্টতই "ব্যবহার কঠোর" আপাতদৃষ্টিতে বৈধ জাভাস্ক্রিপ্ট ভাঙ্গতে পারে যা এর আগে ভাঙেনি। তবে কোডটি আগে ভাঙা হয়নি কোডটি সঠিক হওয়া এবং যা অনুমান করা উচিত তার সমান নয়। সাধারণত অঘোষিত ভেরিয়েবলগুলির উল্লেখ একটি টাইপো ইত্যাদির সংকেত দেয় ইত্যাদি ব্যবহার কঠোরভাবে আপনাকে এই ধরণের ত্রুটিগুলি ধরার অনুমতি দেয় এবং আশা করি আপনি উত্পাদন কোড শিপানোর আগে।
জোস্টেইন কেজনিগেন

5
... বা কেবল আপনার কোডের শেষ পাসের অংশ হিসাবে "ব্যবহার কঠোর" প্রয়োগ করুন, সমস্ত স্পষ্ট সমস্যা সমাধান করুন, সঙ্কুচিত করুন, "যথেষ্ট ভাল" বলুন, তারপরে এটি উত্পাদনের জন্য নিয়ে যান :)
ওল্ফি ইনু

13
ব্যক্তিগতভাবে, আমি কখনই / খুব কমই বিদ্যমান কোডটিতে যুক্ত করি না "use strict";। বলা হচ্ছে, যখন আমি স্ক্র্যাচ থেকে নতুন কোড লিখছি তখন আমি প্রায় সর্বদা এটি ব্যবহার করব
মার্টিন

3
আপনি যদি ইতিমধ্যে জেএসলিন্ট ব্যবহার করে থাকেন তবে সম্ভবত আপনি বেশিরভাগ জায়গাগুলি স্থির করেছেন যেখানে "কঠোর ব্যবহার" জিনিসগুলি ভাঙ্গবে।
জোনাথন

179

ব্যবহার 'use strict';হঠাৎ করে আপনার কোডটি আরও ভাল করে না।

জাভাস্ক্রিপ্ট কঠোর মোডে একটি বৈশিষ্ট্য নাম ECMAScript 5 । আপনি আপনার স্ক্রিপ্ট / ফাংশনের শীর্ষে এটি ঘোষণা করে কঠোর মোড সক্ষম করতে পারেন।

'use strict';

যখন কোনও জাভাস্ক্রিপ্ট ইঞ্জিন এই নির্দেশটি দেখবে , তখন কোডটি একটি বিশেষ মোডে ব্যাখ্যা করা শুরু করবে। এই মোডে, ত্রুটিগুলি ছুঁড়ে ফেলা হয় যখন নির্দিষ্ট কোডিং অনুশীলনগুলি সম্ভব হয় যেগুলি সম্ভাব্য বাগ হিসাবে শেষ হতে পারে (যা কঠোর মোডের পিছনে যুক্তি)।

এই উদাহরণ বিবেচনা করুন:

var a = 365;
var b = 030;

সংখ্যাসূচক অক্ষরে অক্ষরে রেখার তাদের আবেশে, বিকাশকারী অজান্তে অষ্টাল আক্ষরিকের bসাথে ভেরিয়েবলটি আরম্ভ করেছেন । অ-কঠোর মোড এটির সাথে সংখ্যাসূচক আক্ষরিক হিসাবে ব্যাখ্যা করবে 24(বেস 10)। তবে, কঠোর মোড একটি ত্রুটি নিক্ষেপ করবে।

কঠোর মোডে বিশিষ্টতার অ-বিস্তৃত তালিকার জন্য, এই উত্তরটি দেখুন


আমার কোথায় ব্যবহার করা উচিত 'use strict';?

  • আমার নতুন জাভাস্ক্রিপ্ট অ্যাপ্লিকেশন: অবশ্যই! আপনি যখন আপনার কোড দিয়ে বোকা কিছু করছেন তখন কড়া মোড হুইসেল ব্লোয়ার হিসাবে ব্যবহার করা যেতে পারে।

  • আমার বিদ্যমান জাভাস্ক্রিপ্ট কোডে: সম্ভবত না! যদি আপনার বিদ্যমান জাভাস্ক্রিপ্ট কোডটিতে এমন বিবৃতি রয়েছে যা কঠোর মোডে নিষিদ্ধ রয়েছে, তবে অ্যাপ্লিকেশনটি কেবল বিরতি করবে। আপনি যদি কঠোর মোড চান তবে আপনার বিদ্যমান কোডটি ডিবাগ এবং সংশোধন করার জন্য প্রস্তুত থাকতে হবে। এজন্য ব্যবহার করা 'use strict';হঠাৎ করে আপনার কোডকে আরও ভাল করে না


আমি কীভাবে কঠোর মোড ব্যবহার করব?

  1. 'use strict';আপনার স্ক্রিপ্টের উপরে একটি বিবৃতি sert োকান:

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

    নোট করুন যে ফাইলের সমস্ত কিছুই myscript.jsকঠোর মোডে ব্যাখ্যা করা হবে।

  2. অথবা, 'use strict';আপনার ফাংশন বডির উপরে একটি বিবৃতি প্রবেশ করান :

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

    ফাংশনের লেজিকাল স্কোপের সমস্ত কিছুই doSomethingকঠোর মোডে ব্যাখ্যা করা হবে। শব্দগত স্কোপ শব্দটি এখানে গুরুত্বপূর্ণ। উদাহরণস্বরূপ, যদি আপনার কঠোর কোড কোনও লাইব্রেরির কোনও ফাংশনকে কল করে যা কঠোর নয় , কেবলমাত্র আপনার কোডটি কঠোর মোডে কার্যকর করা হয়, এবং ডাকা ফাংশনটি নয়। আরও ভাল ব্যাখ্যার জন্য এই উত্তরটি দেখুন ।


কড়া মোডে কোন জিনিস নিষিদ্ধ?

কড়া মোডে নিষিদ্ধ এমন কয়েকটি বিষয় বর্ণনা করে আমি একটি দুর্দান্ত নিবন্ধ পেয়েছি (নোট করুন এটি কোনও এক্সক্লুসিভ তালিকা নয়):

ব্যাপ্তি

Orতিহাসিকভাবে, জাভাস্ক্রিপ্ট কীভাবে ফাংশনগুলি বাদ দেওয়া যায় তা সম্পর্কে বিভ্রান্ত হয়ে পড়েছে। কখনও কখনও এগুলি স্থিতিশীলভাবে স্কোপযুক্ত বলে মনে হয় তবে কিছু বৈশিষ্ট্যগুলি এগুলি এমনভাবে আচরণ করে যা তারা গতিশীলভাবে বাদ যায়। এটি বিভ্রান্তিকর, প্রোগ্রামগুলি পড়া এবং বুঝতে অসুবিধে করছে। ভুল বোঝাবুঝি বাগের কারণ হয়। এটি পারফরম্যান্সের জন্যও সমস্যা। স্থির স্কোপিংটি সংকলনের সময় পরিবর্তনশীল বাঁধাইয়ের অনুমতি দেয়, তবে গতিশীল সুযোগের প্রয়োজনের অর্থ বাইন্ডিং অবশ্যই রানটাইমকে মুলতবি করা উচিত, যা উল্লেখযোগ্য পারফরম্যান্সের শাস্তি নিয়ে আসে।

কড়া মোডের জন্য সমস্ত পরিবর্তনশীল বাঁধাই স্থিরভাবে করা দরকার। এর অর্থ হ'ল যে বৈশিষ্ট্যগুলির জন্য আগে গতিশীল বাঁধাই করা দরকার সেগুলি অবশ্যই মুছে ফেলা বা সংশোধন করা উচিত। বিশেষত, উইথ স্টেটমেন্টটি মুছে ফেলা হয়, এবং এর কলারের পরিবেশের সাথে छेলা করার ইওল ফাংশনের ক্ষমতা মারাত্মকভাবে সীমাবদ্ধ।

কঠোর কোডের একটি সুবিধা হ'ল ওয়াইউআই কমপ্রেসারের মতো সরঞ্জামগুলি প্রক্রিয়া করার সময় আরও ভাল কাজ করতে পারে।

ইম্প্লিড গ্লোবাল ভেরিয়েবল

জাভাস্ক্রিপ্ট গ্লোবাল ভেরিয়েবল অন্তর্ভুক্ত করেছে। আপনি যদি সুস্পষ্টভাবে কোনও ভেরিয়েবল ঘোষণা না করেন তবে গ্লোবাল ভেরিয়েবল আপনার জন্য স্পষ্টভাবে ঘোষণা করা হয়। এটি প্রোগ্রামিংকে নতুনদের জন্য আরও সহজ করে তোলে কারণ তারা তাদের কিছু বেসিক গৃহকর্মকে অবহেলা করতে পারে। তবে এটি বৃহত্তর প্রোগ্রামগুলির পরিচালনা আরও অনেক কঠিন করে তোলে এবং এটি নির্ভরযোগ্যতার উল্লেখযোগ্যভাবে হ্রাস করে। সুতরাং কঠোর মোডে, অন্তর্নিহিত গ্লোবাল ভেরিয়েবলগুলি আর তৈরি হয় না। আপনার স্পষ্টভাবে আপনার সমস্ত ভেরিয়েবলগুলি ঘোষণা করা উচিত।

গ্লোবাল ফুটো

এমন অনেকগুলি পরিস্থিতি রয়েছে যা this বৈশ্বিক বস্তুর সাথে আবদ্ধ হতে পারে। উদাহরণস্বরূপ, যদি আপনি newকনস্ট্রাক্টর ফাংশন কল করার সময় উপসর্গটি প্রদান করতে ভুলে যান তবে কনস্ট্রাক্টর thisঅপ্রত্যাশিতভাবে গ্লোবাল অবজেক্টের সাথে আবদ্ধ হবে, সুতরাং কোনও নতুন অবজেক্টটি আরম্ভ করার পরিবর্তে এটি চুপচাপ গ্লোবাল ভেরিয়েবলের সাথে চলাচল করবে। এই পরিস্থিতিতে, কঠোর মোড পরিবর্তে আবদ্ধ thisহবে undefined, যার ফলে নির্মাণকারী পরিবর্তে একটি ব্যতিক্রম ছুঁড়ে ফেলবে, ত্রুটিটি খুব শীঘ্রই সনাক্ত করা যাবে।

গোলমাল ব্যর্থতা

জাভাস্ক্রিপ্টটিতে সর্বদা পঠনযোগ্য বৈশিষ্ট্য রয়েছে তবে আপনি ES5 এর Object.createProperty কার্যকারিতাটি সক্ষমতা প্রকাশ না করা পর্যন্ত আপনি সেগুলি নিজে তৈরি করতে পারবেন না । আপনি যদি কেবল পঠনযোগ্য সম্পত্তিতে কোনও মূল্য নির্ধারণের চেষ্টা করেন তবে তা নিঃশব্দে ব্যর্থ হবে। অ্যাসাইনমেন্টটি সম্পত্তিটির মান পরিবর্তন করবে না, তবে আপনার প্রোগ্রামটি যেমন চলছিল তেমন এগিয়ে চলবে। এটি এমন একটি অখণ্ডতা বিপত্তি যা প্রোগ্রামগুলিকে বেমানান অবস্থায় যেতে পারে। কঠোর মোডে, কেবল পঠনযোগ্য সম্পত্তি পরিবর্তন করার চেষ্টা করা ব্যতিক্রম করবে।

অকট্যাল

সংখ্যার অষ্টাল (বা বেস 8) প্রতিনিধিত্বগুলি অত্যন্ত কার্যকর ছিল যখন মেশিন-স্তরের প্রোগ্রামিংগুলি মেশিনগুলিতে যার শব্দ আকারগুলি 3 এর একাধিক ছিল, যখন আপনাকে সিডিসি 6600 মেইনফ্রেমের সাথে কাজ করার সময় অষ্টাল দরকার ছিল, যার শব্দের আকার ছিল 60 বিট। আপনি যদি অষ্টালটি পড়তে পারেন তবে আপনি কোনও শব্দকে 20 অঙ্ক হিসাবে দেখতে পারেন। দুটি সংখ্যা ওপ কোডকে উপস্থাপন করে এবং 8 টি রেজিস্টারের মধ্যে একটি অঙ্ক চিহ্নিত করে। মেশিন কোডগুলি থেকে উচ্চ স্তরের ভাষাগুলিতে ধীরে ধীরে রূপান্তরকালে, প্রোগ্রামিং ভাষাগুলিতে অক্টাল ফর্মগুলি সরবরাহ করার জন্য এটি দরকারী বলে মনে করা হয়েছিল।

সি-তে, অক্টালেন্সের একটি অত্যন্ত দুর্ভাগ্যজনক উপস্থাপনা নির্বাচন করা হয়েছিল: শূন্যের শীর্ষে। সুতরাং সি এর 0100অর্থ, 100 নয়, 64 নয় এবং 08এটি একটি ত্রুটি 8 নয়, এমনকি আরও দুর্ভাগ্যক্রমে, এই অ্যানক্রোনজমটি জাভাস্ক্রিপ্ট সহ প্রায় সমস্ত আধুনিক ভাষায় অনুলিপি করা হয়েছে, যেখানে এটি কেবল ত্রুটি তৈরি করতে ব্যবহৃত হয়। এর অন্য কোনও উদ্দেশ্য নেই। সুতরাং কঠোর মোডে, অষ্টাল ফর্মগুলির আর অনুমতি নেই।

ইত্যাদি

আর্গুমেন্ট সিউডো অ্যারেটি 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

আমি দৃ develop়ভাবে প্রতিটি বিকাশকারীকে এখনই কঠোর মোড ব্যবহার শুরু করার পরামর্শ দিচ্ছি। এটিকে সমর্থন করার মতো পর্যাপ্ত ব্রাউজার রয়েছে যে কঠোর মোড বৈধভাবে আমাদের ত্রুটিগুলি থেকে রক্ষা করতে সহায়তা করবে যা আমরা জানতাম না যে আপনার কোডটিতে ছিল।

স্পষ্টতই, প্রাথমিক পর্যায়ে এমন ত্রুটি থাকবে যা আমরা এর আগে কখনও পাই নি। পূর্ণ সুবিধা পেতে, আমরা সবকিছু পেয়েছি কিনা তা নিশ্চিত করার জন্য আমাদের কঠোর মোডে স্যুইচ করার পরে যথাযথ পরীক্ষা করা প্রয়োজন। অবশ্যই আমরা কেবল use strictআমাদের কোড নিক্ষেপ করি না এবং ধরে নিই যে কোনও ত্রুটি নেই। সুতরাং মন্থ এই যে আরও ভাল কোড লিখতে এই অবিশ্বাস্যভাবে দরকারী ভাষা বৈশিষ্ট্যটি ব্যবহার শুরু করার সময়।

উদাহরণ স্বরূপ,

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

ডাব্লাস ক্রকফোর্ডের লেখা জেএসলিন্ট একটি ডিবাগার। কেবল আপনার স্ক্রিপ্টে পেস্ট করুন এবং এটি আপনার কোডের কোনও লক্ষণীয় সমস্যা এবং ত্রুটিগুলির জন্য দ্রুত স্ক্যান করবে।


6
@ জ্যামি হাটবার: অনুগ্রহ করে এই লিঙ্কটি দেখুন ক্যানিজিউজ / ইউজ -স্ট্রিক্ট এবং কাঙ্গাক্সস . github.io/es5-compat-table । এটি সমস্ত ব্রাউজারের জন্য সঠিক ধারণা দেবে।
প্যাঙ্ক

95

আমি অন্যান্য উত্তরগুলির পরিপূরক হিসাবে আরও কিছু প্রতিষ্ঠিত উত্তর দিতে চাই। আমি সর্বাধিক জনপ্রিয় উত্তরটি সম্পাদনা করার আশা করছিলাম তবে ব্যর্থ হয়েছিল failed আমি এটিকে যতটা সম্ভব ব্যাপক এবং সম্পূর্ণ করার চেষ্টা করেছি।

আপনি আরও তথ্যের জন্য 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কঠোর মোডে-স্টেটমেন্ট ব্যবহার করতে পারবেন না ।
  • কড়া মোডে সমস্ত ভেরিয়েবলগুলি ঘোষণা করতে হবে: আপনি যদি এমন কোনও শনাক্তকারীকে এমন কোনও মান নির্ধারণ করেন যা ভেরিয়েবল, ফাংশন, ফাংশন প্যারামিটার, ক্যাচ-ক্লজ প্যারামিটার বা বিশ্বব্যাপী সম্পত্তি হিসাবে ঘোষণা করা হয়নি 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অপারেটরটি কোনও অযোগ্য যোগ্য সনাক্তকারী (একটি ভেরিয়েবল, ফাংশন বা ফাংশন প্যারামিটার) অনুসরণ করবেন তখন আপনি পাবেন a সাধারণ মোডে deleteঅভিব্যক্তিটি কিছুই করতে পারে না এবং তা মূল্যায়ন করা হয় false
  • আপনি TypeErrorযখন কোনও কনফিগারযোগ্য সম্পত্তি মুছে ফেলার চেষ্টা করবেন তখন কঠোর মোডে আপনি পাবেন । (সাধারণ মোডে চেষ্টাটি ব্যর্থ হয় এবং deleteঅভিব্যক্তিটির মূল্যায়ন হয় false)।
  • আপনি যখন কোনও বস্তুর আক্ষরিক জন্য একই নামের সাথে একাধিক বৈশিষ্ট্য সংজ্ঞায়িত করার চেষ্টা করেন তখন কঠোর মোডে এটি একটি সিনট্যাক্টিকাল ত্রুটি হিসাবে বিবেচিত হয়। (সাধারণ মোডে কোনও ত্রুটি নেই))
  • কঠোর মোডে এটি একটি সিনট্যাক্টিকাল ত্রুটি হিসাবে বিবেচিত হয় যখন কোনও ফাংশন ঘোষণায় একই নামের একাধিক পরামিতি থাকে। (সাধারণ মোডে কোনও ত্রুটি নেই))
  • কঠোর মোডে অষ্টাল আক্ষরিক অনুমতি দেওয়া হয় না (এগুলি আক্ষরিক যা দিয়ে শুরু হয় 0xnormal (সাধারণ মোডে কিছু বাস্তবায়ন অক্টাল লিটারালকে অনুমতি দেয়))
  • কঠোর মোডে শনাক্তকারীদের evalএবং argumentsকীওয়ার্ডের মতো আচরণ করা হয়। আপনি তাদের মান পরিবর্তন করতে পারবেন না, তাদের কোনও মান নির্ধারণ করতে পারবেন না এবং আপনি এগুলি ভেরিয়েবল, ফাংশন, ফাংশন পরামিতি বা ক্যাচ ব্লকের সনাক্তকারী হিসাবে নাম হিসাবে ব্যবহার করতে পারবেন না।
  • কঠোর মোডে কল স্ট্যাক পরীক্ষা করার সম্ভাবনাগুলিতে আরও বিধিনিষেধ রয়েছে। arguments.callerএবং কঠোর মোডে একটি ফাংশন arguments.calleeএকটি কারণ TypeError। তদ্ব্যতীত, কিছু কলার- এবং যুক্তিগুলির যুক্তিগুলি কঠোর মোডে ফাংশনগুলির কারণে TypeErrorযখন আপনি সেগুলি পড়ার চেষ্টা করেন cause

4
"কঠোর মোডে অক্টাল লিটারেলগুলিকে অনুমতি দেওয়া হয় না (এগুলি আক্ষরিক যা 0x দিয়ে শুরু হয় ...)" অক্টাল লিটারালগুলি একটি শীর্ষস্থানীয় দিয়ে শুরু হয় 0
অ্যালেক্স গিত্তেমিয়ার

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বিবৃতি:

withuglify-js এর মতো সরঞ্জাম ব্যবহার করে বিবৃতিগুলি ছোট করা যায় না । এগুলি ভবিষ্যতের জাভাস্ক্রিপ্ট সংস্করণগুলি থেকে অবচিত ও সরানো হয়েছে

Sample

সদৃশ প্রতিরোধ করে:

যখন আমাদের সদৃশ সম্পত্তি আছে, এটি একটি ব্যতিক্রম ছোঁড়ে

আনকচড সিনট্যাক্স এরির: অবজেক্ট আক্ষরিক মধ্যে ডুপ্লিকেট ডেটা সম্পত্তি কড়া মোডে অনুমোদিত নয়

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

আরও কিছু আছে তবে আমার এ বিষয়ে আরও জ্ঞান অর্জন করতে হবে।


ECMAScript 2015 এর সাথে সদৃশ সম্পত্তি নামগুলি আবার অনুমোদিত! এমডিএন ডকুমেন্টেশন দেখুন ।
ফিল্মকোল

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 ) এ আর হয় না ।

  • একই নাম ফাংশন সহ দুটি ফাংশন যুক্তি ঘোষণা করা ing

    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 এর সাথে সদৃশ সম্পত্তি নামগুলি আবার অনুমোদিত! এমডিএন ডকুমেন্টেশন দেখুন ।
ফিল্মকোল

53

কড়া মোড সাধারণ জাভাস্ক্রিপ্ট শব্দার্থবিজ্ঞানের বিভিন্ন পরিবর্তন করে:

  • কিছু জাভাস্ক্রিপ্ট নীরব ত্রুটিগুলি ত্রুটি নিক্ষেপ করে পরিবর্তন করে তাদের সরিয়ে দেয়।

  • জাভাস্ক্রিপ্ট ইঞ্জিনগুলির অপ্টিমাইজেশন সম্পাদন করা কঠিন করে এমন ভুলগুলি সংশোধন করে।

  • ECMAScript এর ভবিষ্যত সংস্করণগুলিতে সংজ্ঞায়িত হওয়ার মতো কিছু সিনট্যাক্স নিষিদ্ধ করে।

আরও তথ্যের জন্য vistit স্ট্রিক্ট মোড- জাভাস্ক্রিপ্ট


52

"কঠোর ব্যবহার করুন"; প্রোগ্রামার জাভাস্ক্রিপ্টের আলগা বা খারাপ বৈশিষ্ট্য ব্যবহার করবে না এমন একটি বীমা। এটি একটি গাইড, ঠিক যেমন কোনও শাসক আপনাকে সোজা লাইন তৈরি করতে সহায়তা করবে। "স্ট্রাইক ব্যবহার করুন" আপনাকে "স্ট্রেইট কোডিং" করতে সহায়তা করবে।

যাঁরা শাসকদের তাদের লাইনগুলি সরাসরি না করতে ব্যবহার করতে পছন্দ করেন তারা সাধারণত তাদের পৃষ্ঠাগুলিতে অন্যদের কোডটি ডিবাগ করার জন্য অনুরোধ করে।

আমাকে বিশ্বাস কর. খারাপভাবে ডিজাইন করা কোডের তুলনায় ওভারহেডটি নগন্য। ডাগ ক্রকফোর্ড, যিনি বেশ কয়েক বছর ধরে সিনিয়র জাভাস্ক্রিপ্ট বিকাশকারী ছিলেন, এখানে একটি খুব আকর্ষণীয় পোস্ট রয়েছে । ব্যক্তিগতভাবে, আমি আমার ভাল অনুশীলনটি ভুলে যাব না তা নিশ্চিত করার জন্য আমি সর্বদা তার সাইটে ফিরে যেতে চাই।

আধুনিক জাভাস্ক্রিপ্ট অনুশীলন সর্বদা "কঠোর ব্যবহার করুন" উত্সাহিত করা উচিত; pragma। ইসিএমএ গ্রুপ "স্ট্রিক্ট" মোডটিকে alচ্ছিক করার একমাত্র কারণ হ'ল জাভাস্ক্রিপ্টটিতে কম অভিজ্ঞ কোডারদের অ্যাক্সেসের অনুমতি দেওয়া এবং নতুন এবং নিরাপদ কোডিং অনুশীলনের সাথে খাপ খাইয়ে দেওয়ার জন্য সময় দেওয়া।


66
কঠোর মোডটি isচ্ছিক হওয়ার কারণে আপনি যা বলেছেন তার সাথে কিছুই করার নেই। আসল কারণ হ'ল বিদ্যমান কোডটি না ভঙ্গ করা যা মেনে চলতে পারে না
অক্সিজেন

17
প্রকৃতপক্ষে, "অভিজ্ঞ কঠোর ব্যবহার" সক্ষম করার জন্য কম অভিজ্ঞ কোডারদের প্রথম হওয়া উচিত ;
অ্যান্টি হাপাল

46

সহ use strictএই বিন্দু থেকে আপনার সব সংবেদনশীল জাভাস্ক্রিপ্ট ফাইল প্রারম্ভে একটি উন্নততর জাভাস্ক্রিপ্ট প্রোগ্রামার হতে হবে এবং বিশ্বব্যাপী হওয়ার জন্য এবং কিছু চুপটি পরিবর্তন র্যান্ডম ভেরিয়েবল এড়িয়ে যেতে একটি ছোট উপায়।


42

ডাব্লু 3 স্কুল থেকে উদ্ধৃতি :

"ব্যবহার কঠোর" নির্দেশিকা

"ব্যবহার কঠোর" নির্দেশটি জাভাস্ক্রিপ্ট ১.৮.৫ (ইসমাস্ক্রিপ্ট সংস্করণ 5) এ নতুন।

এটি কোনও বিবৃতি নয়, তবে একটি আক্ষরিক অভিব্যক্তি, জাভাস্ক্রিপ্টের পূর্ববর্তী সংস্করণগুলি দ্বারা উপেক্ষা করা।

"কঠোর ব্যবহারের উদ্দেশ্য" এর উদ্দেশ্যটি হ'ল কোডটি "কঠোর মোডে" কার্যকর করা উচিত।

কঠোর মোডের সাহায্যে আপনি উদাহরণস্বরূপ, অঘোষিত ভেরিয়েবলগুলি ব্যবহার করতে পারবেন না।

কঠোর মোড কেন?

কড়া মোড "জাভাস্ক্রিপ্ট" সুরক্ষিত লেখা সহজ করে তোলে।

পূর্বে স্বীকৃত "খারাপ সিনট্যাক্স" কে সত্য মোডে সত্য মোড পরিবর্তন করে।

উদাহরণ হিসাবে, সাধারণ জাভাস্ক্রিপ্টে, একটি ভেরিয়েবলের নাম ভুল টাইপ করা একটি নতুন গ্লোবাল ভেরিয়েবল তৈরি করে। কঠোর মোডে, এটি ত্রুটি ছুঁড়ে দেবে, দুর্ঘটনাক্রমে বৈশ্বিক চলক তৈরি করা অসম্ভব হয়ে পড়ে।

সাধারণ জাভাস্ক্রিপ্টে, কোনও বিকাশকারী অ-লিখনযোগ্য বৈশিষ্ট্যগুলিকে মান নির্ধারণের ক্ষেত্রে কোনও ত্রুটি প্রতিক্রিয়া পাবেন না।

কঠোর মোডে, কোনও লিখিতযোগ্য সম্পত্তি, কেবলমাত্র প্রাপ্তি-সম্পত্তি, একটি অ-বিদ্যমান সম্পত্তি, অ-বিদ্যমান ভেরিয়েবল, বা অ-বিদ্যমান বস্তুর কোনও অ্যাসাইনমেন্ট ত্রুটি ছুঁড়ে দেবে।

আরও জানতে দয়া করে http://www.w3schools.com/js/js_strict.asp দেখুন


37

"use strict"কড়া মোডে চলার জন্য জাভাস্ক্রিপ্ট কোড তৈরি করে , যার মূলত ব্যবহারের আগে সমস্ত কিছু সংজ্ঞায়িত করা দরকার। কঠোর মোড ব্যবহারের মূল কারণ হ'ল অপরিজ্ঞাত পদ্ধতিগুলির দুর্ঘটনাজনিত বৈশ্বিক ব্যবহার এড়ানো।

কঠোর মোডেও, জিনিসগুলি দ্রুত সঞ্চালিত হয়, কিছু সতর্কতা বা নীরব সতর্কতা মারাত্মক ত্রুটি ছুঁড়ে দেয়, একটি সুন্দর কোড তৈরি করতে সর্বদা এটি ব্যবহার করা ভাল।

"use strict"ECMA5 এ বহুলভাবে প্রয়োজন, ECMA6 এ এটি পূর্বনির্ধারিতভাবে জাভাস্ক্রিপ্টের অংশ , সুতরাং আপনি ES6 ব্যবহার করছেন তবে এটি যুক্ত করার দরকার নেই।

এমডিএন থেকে প্রাপ্ত এই বিবৃতি এবং উদাহরণগুলি দেখুন:

"ব্যবহার কঠোর" নির্দেশিকা
"ব্যবহার কঠোর" নির্দেশটি জাভাস্ক্রিপ্ট ১.৮.৫ (ইসমাস্ক্রিপ্ট সংস্করণ ৫) এ নতুন। এটি কোনও বিবৃতি নয়, তবে একটি আক্ষরিক অভিব্যক্তি, জাভাস্ক্রিপ্টের পূর্ববর্তী সংস্করণগুলি দ্বারা উপেক্ষা করা। "কঠোর ব্যবহারের উদ্দেশ্য" এর উদ্দেশ্যটি হ'ল কোডটি "কঠোর মোডে" কার্যকর করা উচিত। কঠোর মোডের সাহায্যে আপনি উদাহরণস্বরূপ, অঘোষিত ভেরিয়েবলগুলি ব্যবহার করতে পারবেন না।

"কঠোর ব্যবহার" ব্যবহারের উদাহরণ:
ফাংশনগুলির জন্য কঠোর মোড: একইভাবে, কোনও ক্রিয়াকলাপের জন্য কঠোর মোড আহ্বান করতে, সঠিক বিবৃতিটি "কঠোরভাবে ব্যবহার করুন" রাখুন; (বা 'কঠোর ব্যবহার';) অন্য কোনও বিবৃতি দেওয়ার আগে ফাংশনটির শরীরে।

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

আপনি এমডিএন আরও পড়তে পারেন ।


31

ECMAScript কমিটিতে থাকা কিছু লোকের একটি ভাল আলোচনা রয়েছে: জাভাস্ক্রিপ্টে পরিবর্তনগুলি, অংশ 1: ​​ECMAScript 5 " কীভাবে "use strict"জাভাস্ক্রিপ্ট প্রয়োগকারীরা হঠাৎ করে প্রতিটি ওয়েবসাইট ভঙ্গ না করে জাভাস্ক্রিপ্টের বিপজ্জনক বৈশিষ্ট্যগুলির অনেকগুলি পরিষ্কার করতে দেয় about এ পৃথিবীতে.

অবশ্যই এটি ঠিক এইগুলি সম্পর্কে ভুলভাবে কথা বলে যে এইসব অপব্যবহারের অনেকগুলি কী ছিল (কী ছিল) এবং ইসমাস্ক্রিপ্ট 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 পরিবর্তনশীল যুক্ত করবে (সাধারণত এটি সর্বোত্তম অনুশীলন নয় এবং কঠোর মোড তা এড়াতে সহায়তা করে)।
মাইকেল 25

1
কেউ কি দ্বিতীয় উদাহরণ ব্যাখ্যা করতে পারেন? আমি পাই না। this === 'a'উভয় উদাহরণে থাকা উচিত নয় ?
ম্যাক্সিমডাব্লু

19

নোট যেটি ইকামাস্ক্রিপ্ট 5 এuse strict চালু হয়েছিল এবং তখন থেকেই এটি রাখা হয়েছিল।

নীচে ES6 এবং ES7 এ কড়া মোড ট্রিগার করার শর্তাবলী :

  • গ্লোবাল কোডটি কঠোর মোড কোড হয় যদি এটি কোনও ব্যবহার কঠোর নির্দেশিকা (14.1.1 দেখুন) সম্বলিত নির্দেশিক প্রোলগ দিয়ে শুরু হয়।
  • মডিউল কোড সর্বদা কঠোর মোড কোড।
  • একটি ClassDeclaration বা ClassExpression এর সমস্ত অংশ কড়া মোড কোড।
  • ইভাল কোডটি কঠোর মোড কোড হয় যদি এটি কোনও স্ট্রাইকটিভ প্রোলগের সাথে শুরু হয় যার মধ্যে ব্যবহারের কঠোর নির্দেশিকা থাকে বা যদি কলটি খোলার ডায়রেক্ট ইভাল হয় (12.3.4.1 দেখুন) যা কঠোর মোড কোডের মধ্যে রয়েছে।
  • যদি ফাংশন কোডটি সম্পর্কিত ফাংশনডেক্লারেশন, ফাংশনএক্সপ্রেসন, জেনারেটর ডিক্লেয়ারেশন, জেনারেটর এক্সপ্রেসন, মেথডডিফাইনিশন, বা তীর ফাংশনটি কঠোর মোড কোডে অন্তর্ভুক্ত থাকে বা যদি ফাংশনের [[ECMAScriptCode]] অভ্যন্তরীণ স্লটের মান উৎপন্ন করে একটি নির্দেশিক প্রোলগ দিয়ে শুরু হয় তবে ফাংশন কোডটি কঠোর মোড কোড হয় এতে একটি ব্যবহার কঠোর নির্দেশিকা রয়েছে।
  • ফাংশন কোড যে যদি গত যুক্তি স্ট্রিং যে যখন প্রক্রিয়াভুক্ত একটি অন্তর্নিহিত ফাংশন এবং জেনারেটর কনস্ট্রাকটর হয় কঠোর মোডে কোডে আর্গুমেন্ট হিসাবে সরবরাহ করা হয় FunctionBody করে একটি নির্দেশিকা প্রস্তাবনা করে একটি ব্যবহার করুন যথাযথ নির্দেশিকা থাকা শুরু হয়।

14

বিকাশকারীদের কেন ব্যবহার করা উচিত তার প্রধান কারণগুলি হ'ল "use strict":

  1. গ্লোবাল ভেরিয়েবলগুলির দুর্ঘটনাজনিত ঘোষণা প্রতিরোধ করে U ব্যবহারকারীরা "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

"কঠোর ব্যবহার"; জাভাস্ক্রিপ্টকে আরও কিছুটা শক্তিশালী করার জন্য ইসমা প্রচেষ্টা। এটি জেএসকে অন্ততপক্ষে কিছুটা "কঠোর" করার চেষ্টা করেছে (অন্যান্য ভাষা 90 এর দশক থেকে কঠোর নিয়ম প্রয়োগ করে)। এটি আসলে জাভাস্ক্রিপ্ট বিকাশকারীদের কিছু ধরণের কোডিং সেরা অভ্যাস অনুসরণ করতে বাধ্য করে। তবুও, জাভাস্ক্রিপ্ট খুব ভঙ্গুর। টাইপড ভেরিয়েবল, টাইপ করা পদ্ধতি ইত্যাদির মতো কোনও জিনিস নেই is ডিবাগ।


12

ECMAScript 5 এ জাভাস্ক্রিপ্ট "কঠোর" মোড চালু হয়েছিল।

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

"use strict";আপনার জেএস ফাইলের একেবারে শীর্ষে লেখা কঠোর বাক্য গঠন পরীক্ষা করা চালু করে। এটি আমাদের জন্য নিম্নলিখিত কাজগুলি করে:

  1. আপনি যদি একটি অঘোষিত ভেরিয়েবল বরাদ্দ করার চেষ্টা করেন তবে একটি ত্রুটি দেখায়

  2. কী জেএস সিস্টেম লাইব্রেরিগুলিকে ওভাররাইট করা থেকে বিরত রাখে

  3. কিছু অনিরাপদ বা ত্রুটি-প্রবণ ভাষার বৈশিষ্ট্যগুলি নিষিদ্ধ করে

use strictএছাড়াও স্বতন্ত্র ফাংশন ভিতরে কাজ করে। use strictআপনার কোডে অন্তর্ভুক্ত করা সর্বদা একটি ভাল অনুশীলন ।

ব্রাউজারের সামঞ্জস্যতা ইস্যু: "ব্যবহার" নির্দেশাবলী পিছনের দিকে সামঞ্জস্যপূর্ণ বোঝানো হয়। ব্রাউজারগুলি যা তাদের সমর্থন করে না তারা কেবল একটি স্ট্রিং আক্ষরিক দেখতে পাবে যা এর আগে উল্লেখ করা হয়নি isn't সুতরাং, তারা এটির পাশ দিয়ে এগিয়ে যাবে।


12

use strictআপনার কোডকে আরও সুরক্ষিত করার একটি উপায়, কারণ আপনি বিপজ্জনক বৈশিষ্ট্যগুলি ব্যবহার করতে পারবেন না যা আপনার প্রত্যাশা মতো কাজ করতে পারে না। এবং, যেমনটি আগে লেখা হয়েছিল, এটি কোডটিকে আরও কঠোর করে তোলে।


11

স্ট্রাইক ব্যবহার সাধারণ এবং পুনরাবৃত্তি ত্রুটিগুলি দেখানোর জন্য ব্যবহৃত হয় যাতে এটি অন্যভাবে পরিচালনা করা হয় এবং জাভা স্ক্রিপ্টটি যেভাবে চালিত হয় সেভাবে পরিবর্তন করে: এই জাতীয় পরিবর্তনগুলি:

  • দুর্ঘটনাজনিত গ্লোবালগুলি প্রতিরোধ করে

  • কোনও সদৃশ নেই

  • সাথে মুছে দেয়

  • এই জবরদস্তি দূর করে

  • নিরাপদ বিভাজন ()

  • অপরিবর্তনীয় জন্য ত্রুটি

আপনি বিশদ জন্য এই নিবন্ধটি পড়তে পারেন


11

সাধারণত, জাভাস্ক্রিপ্ট কঠোর নিয়ম অনুসরণ করে না, ফলে ত্রুটির সম্ভাবনা বাড়ছে। ব্যবহারের পরে "use strict", জাভাস্ক্রিপ্ট কোডে অন্যান্য প্রোগ্রামিং ভাষার যেমন টার্মিনেটর ব্যবহার, প্রারম্ভিককরণের পূর্বে ঘোষণা ইত্যাদির মতো নিয়মের কঠোর সেট অনুসরণ করা উচিত etc.

যদি "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ফাংশনটির ভিতরে একটি ভেরিয়েবল ব্যবহার করছি । অভ্যন্তরীণভাবে, সংকলকটি প্রথমে সেই নির্দিষ্ট ফাংশনের সুযোগে সেই নির্দিষ্ট নামের সাথে কোনও ভেরিয়েবল ঘোষণা করে কিনা তা পরীক্ষা করবে। যেহেতু সংকলক বুঝতে পেরেছিল যে এরকম কোনও চলক নেই তাই এটি বাহ্যিক স্কোপটি পরীক্ষা করবে। আমাদের ক্ষেত্রে এটি বিশ্বব্যাপী সুযোগ। আবার, সংকলকটি বুঝতে পেরেছিল যে 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

এখানে, সংকলক রেফারেন্স ত্রুটি ছুড়ে ফেলেছে। কঠোর মোডে, সংকলকটি এটি ঘোষণা না করে আমাদের ভেরিয়েবলটি ব্যবহার করার অনুমতি দেয় না। সুতরাং মেমরি ফাঁস প্রতিরোধ করা যেতে পারে। উপরন্তু, আমরা আরও অনুকূলিতকরণ কোড লিখতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.