javascript - ماذا "استخدام صارمة" القيام به في جافا سكريبت، وما هو السبب وراء ذلك؟


في الآونة الأخيرة، ركضت بعض من شفرة جافا سكريبت من خلال جسلينت كروكفورد، وأعطت الخطأ التالي:

مشكلة في السطر 1 حرف 1: مفقود "استخدام صارم" بيان.

القيام ببعض البحث، أدركت أن بعض الناس إضافة "use strict"; في شفرة جافا سكريبت الخاصة بهم. بعد إضافة البيان، توقف الخطأ عن الظهور. للأسف، لم تكشف غوغل عن الكثير من التاريخ وراء بيان السلسلة هذا. بالتأكيد يجب أن يكون لها علاقة مع كيفية تفسير جافا سكريبت من قبل المتصفح، ولكن ليس لدي أي فكرة عن تأثير سيكون.

فما هو "use strict"; كل شيء، ماذا يعني ذلك، وهل ما زال مناسبا؟

هل أي من المتصفحات الحالية تستجيب ل "use strict"; سلسلة أو هو للاستخدام في المستقبل؟



Answers



هذه المقالة حول وضع جافا سكريبت صارمة قد تهمك: جون ريسيغ - إكماسكريبت 5 وضع صارم، جسون، وأكثر

أن أقتبس بعض أجزاء مثيرة للاهتمام:

وضع صارم هو ميزة جديدة في إكماسكريبت 5 التي تسمح لك لوضع برنامج، أو وظيفة، في سياق "صارم" التشغيل. هذا السياق الصارم يمنع اتخاذ إجراءات معينة ويثير المزيد من الاستثناءات.

و:

يساعد الوضع الصارم في طريقتين:

  • فإنه يمسك بعض بلوبيرس الترميز المشتركة، رمي الاستثناءات.
  • فهو يمنع، أو يلقي الأخطاء، عندما يتم اتخاذ إجراءات "غير آمنة" نسبيا (مثل الحصول على الوصول إلى الكائن العالمي).
  • فإنه تعطيل الميزات التي مربكة أو سيئة التفكير بها.

نلاحظ أيضا يمكنك تطبيق "وضع صارم" على الملف كله ... أو يمكنك استخدامه فقط لوظيفة معينة (لا يزال نقلا عن مقال جون ريسيغ) :

// Non-strict code...

(function(){
  "use strict";

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

// Non-strict code... 

والتي قد تكون مفيدة إذا كان لديك لخلط القديم والجديد رمز ؛-)

لذلك، أفترض أنه قليلا مثل "use strict" يمكنك استخدامها في بيرل (وبالتالي اسم؟) : فإنه يساعدك على جعل عدد أقل من الأخطاء، من خلال الكشف عن المزيد من الأشياء التي يمكن أن تؤدي إلى الكسر.

حاليا، انها معتمدة من قبل جميع المتصفحات الرئيسية (شريط إي 9 وأدناه) .




انها ميزة جديدة من إكماسكريبت 5. كتب جون ريسيغ حتى ملخص لطيفة منه.

انها مجرد سلسلة كنت وضعت في ملفات جافا سكريبت (إما في الجزء العلوي من الملف الخاص بك أو داخل وظيفة) التي تبدو كما يلي:

"use strict";

وضعه في التعليمات البرمجية الخاصة بك الآن لا ينبغي أن يسبب أي مشاكل مع المتصفحات الحالية لأنها مجرد سلسلة. وقد يتسبب ذلك في حدوث مشكلات مع الشفرة في المستقبل إذا كانت الشفرة تنتهك براغما. على سبيل المثال، إذا كان لديك حاليا foo = "bar" دون تعريف foo أولا، سوف تبدأ التعليمات البرمجية الخاصة بك فشل ... وهو أمر جيد في رأيي.




البيان "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] مرتبطة ب وهكذا.)

  12. arguments.callee غير مدعوم

[ريف: ستريكت مود ، موزيلا ديفيلوبر نيتورك ]




إذا كان الناس قلقون حول استخدام use strict قد يكون من المفيد التحقق من هذه المقالة:

إكماسكريبت 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.
*/



كلمة من الحذر، كل ما لكم المبرمجين بجد: تطبيق "use strict" إلى التعليمات البرمجية الموجودة يمكن أن تكون خطرة! هذا الشيء ليس بعض يشعر جيدة، ملصقا سعيد الوجه التي يمكنك صفعة على رمز لجعله "أفضل". مع براغما "use strict" ، فإن المتصفح فجأة استثناءات ررو في الأماكن العشوائية التي لم يلق قبل ذلك فقط لأنه في تلك البقعة كنت تفعل شيئا افتراضيا / فضفاضة جافا سكريبت يسمح بسعادة ولكن جافاسكريبت صارمة أبهورس! قد يكون لديك انتهاكات صارمة يختبئ في المكالمات نادرا ما تستخدم في التعليمات البرمجية الخاصة بك التي سوف رمي فقط استثناء عندما يفعلون في نهاية المطاف الحصول على تشغيل - ويقول، في بيئة الإنتاج أن الزبائن الدفع تستخدم!

إذا كنت تريد أن تأخذ يغرق، فمن فكرة جيدة لتطبيق "use strict" جنبا إلى جنب مع اختبارات وحدة شاملة ومهمة تكوين جشينت تكوينها بدقة من شأنها أن تعطيك بعض الثقة أنه لا يوجد زاوية مظلمة من الوحدة النمطية الخاصة بك التي سوف تفجير فظيعة فقط لأنك قمت بتشغيل وضع صارم. أو، مهلا، وهنا خيار آخر: فقط لا تضيف "use strict" إلى أي من التعليمات البرمجية القديمة الخاصة بك، فإنه ربما أكثر أمانا بهذه الطريقة، بصراحة. بالتأكيد لا تضيف "use strict" إلى أي وحدات لا تملكها أو الحفاظ عليها، مثل وحدات الطرف الثالث.

أعتقد أنه على الرغم من أنه حيوان القفص القاتل، "use strict" يمكن أن تكون الأشياء الجيدة، ولكن عليك أن تفعل ذلك الحق. أفضل وقت للذهاب صارمة هو عندما المشروع الخاص بك هو غرينفيلد وكنت بدأت من الصفر. تكوين JSHint/JSLint مع جميع التحذيرات والخيارات مكرنك تصل ضيق كما فريقك يمكن أن المعدة، والحصول على جيدة بناء / اختبار / تأكيد نظام دو جور مزورة مثل Grunt+Karma+Chai ، وفقط بعد ذلك بدء بمناسبة كل ما تبذلونه من وحدات جديدة باسم "use strict" . تكون على استعداد لعلاج الكثير من الأخطاء والتحذيرات نيغلي. تأكد من أن الجميع يفهم الجاذبية من خلال تكوين بناء إلى فشل إذا JSHint/JSLint تنتج أي انتهاكات.

لم يكن مشروعي مشروعا جديدا عندما اعتمدت "use strict" . ونتيجة لذلك، بلدي إيد مليء علامات حمراء لأنني لم يكن لديك "use strict" على نصف وحدات بلدي، ويشكو جشينت عن ذلك. انها تذكير لي حول ما إعادة بيعها يجب أن أفعل في المستقبل. هدفي هو أن تكون علامة حمراء مجانا بسبب كل من بلدي في عداد المفقودين "use strict" البيانات، ولكن هذا هو سنوات بعيدا الآن.




أوصي بشدة كل مطور لبدء استخدام وضع صارم الآن. هناك ما يكفي من المتصفحات التي تدعم ذلك أن وضع صارم يساعد بشكل قانوني حفظ لنا من الأخطاء التي لم نعرف حتى كانت في التعليمات البرمجية الخاصة بك.

على ما يبدو، في المرحلة الأولى سيكون هناك أخطاء لم نواجهها من قبل. للحصول على الفائدة الكاملة، نحن بحاجة إلى القيام الاختبار السليم بعد التحول إلى وضع صارم للتأكد من أننا قد اشتعلت كل شيء. بالتأكيد نحن لا مجرد رمي use strict في التعليمات البرمجية لدينا، ونفترض أنه لا توجد أخطاء. وبالتالي فإن زبد هو أن الوقت قد حان للبدء في استخدام هذه الميزة لغة مفيدة بشكل لا يصدق لكتابة رمز أفضل.

فمثلا،

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

جسلينت هو مصحح أخطاء كتبه دوغلاس كروكفورد. ببساطة لصق في السيناريو الخاص بك، وأنها سوف تفحص بسرعة عن أي مشاكل ملحوظة والأخطاء في التعليمات البرمجية الخاصة بك.




استخدام '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 في وضع صارم. كلمة المعجم نطاق مهم هنا. انظر هذه الإجابة للحصول على شرح أفضل.

ما هي الأشياء المحظورة في وضع صارم؟

لقد وجدت مقالة لطيفة تصف عدة أشياء محظورة في وضع صارم (لاحظ أن هذه ليست قائمة حصرية):

نطاق

تاريخيا، تم الخلط بين جافا سكريبت وكيفية تحديد الوظائف. في بعض الأحيان يبدو أنها تحديد نطاق ثابت، ولكن بعض الميزات تجعلها تتصرف مثل أنها يتم تحديد نطاق حيوي. وهذا أمر مربك، مما يجعل من الصعب قراءة البرامج وفهمها. سوء الفهم يسبب البق. كما أنها مشكلة للأداء. ومن شأن تحديد النطاق الثابت أن يسمح بالتزام متغير بحدوث وقت تجميعي، ولكن شرط النطاق الدينامي يعني أن الربط يجب تأجيله إلى وقت التشغيل، الذي يأتي مع عقوبة أداء كبيرة.

يتطلب وضع صارم أن يتم كل متغير ملزمة بشكل ثابت. وهذا يعني أن الميزات التي كانت مطلوبة مسبقا ملزمة ديناميكية يجب القضاء أو تعديلها. على وجه التحديد، يتم حذف البيان مع، وتقييد قدرة وظيفة التقييم على العبث مع البيئة من المتصل لها بشدة.

واحدة من فوائد قانون صارم هو أن أدوات مثل يوي ضاغط يمكن القيام بعمل أفضل عند معالجته.

المتغيرات العالمية المضمنة

وقد ضمنت جافا سكريبت المتغيرات العالمية. إذا لم تعلن صراحة متغيرا، فإن متغيرا عالميا يتم الإعلان عنه ضمنيا. وهذا يجعل البرمجة أسهل للمبتدئين لأنها يمكن أن تهمل بعض الأعمال المنزلية الأساسية. ولكنه يجعل إدارة البرامج الأكبر حجما أكثر صعوبة بكثير ويؤدي إلى تدهور كبير في الموثوقية. لذلك في وضع صارم، لم تعد متغيرات عالمية ضمنية. يجب أن تعلن صراحة جميع المتغيرات الخاصة بك.

تسرب العالمية

هناك عدد من الحالات التي يمكن أن تتسبب في أن يكون this مرتبطا بالعنصر العالمي. على سبيل المثال، إذا نسيت تقديم البادئة new عند استدعاء الدالة كونستروكتور، فسيتم ربط منشئ this بشكل غير متوقع إلى الكائن العام، وذلك بدلا من تهيئة كائن جديد، بدلا من ذلك سوف العبث بصمت مع المتغيرات العالمية. في هذه الحالات، وضع صارم بدلا من ذلك ربط this إلى undefined ، الأمر الذي سيجعل منشئ لرمي استثناء بدلا من ذلك، مما يسمح للخطأ أن يتم الكشف عن ذلك في وقت أقرب بكثير.

فشل صاخبة

كان جافا سكريبت دائما خصائص للقراءة فقط، ولكن لم تتمكن من إنشاءها بنفسك حتى تعرض وظيفة Object.createProperty هذه القدرة. إذا حاولت تعيين قيمة إلى خاصية للقراءة فقط، فستفشل بشكل صامت. لن تغير التخصيص قيمة العقار، ولكن البرنامج الخاص بك سوف المضي قدما كما لو كان. هذا هو خطر النزاهة التي يمكن أن تسبب البرامج للذهاب إلى حالة غير متناسقة. في الوضع الدقيق، سيؤدي محاولة تغيير خاصية للقراءة فقط إلى استثناء.

أوكتال

وكان التمثيل الثماني (أو القاعدة 8) من الأرقام مفيدة للغاية عند القيام البرمجة على مستوى الجهاز على الآلات التي أحجام الكلمة كانت متعددة من 3. كنت في حاجة الثماني عند العمل مع سدك 6600 المركزية، التي كان لها حجم كلمة من 60 بت. إذا كنت يمكن أن تقرأ الثماني، هل يمكن أن ننظر إلى كلمة 20 أرقام. يمثل رقمان الرمز أوب، وحدد رقم واحد واحد من 8 سجلات. وأثناء الانتقال البطيء من رموز الآلات إلى اللغات عالية المستوى، كان يعتقد أن من المفيد تقديم أشكال ثماني في لغات البرمجة.

في C، تم اختيار تمثيل مؤسف للغاية من الثماني: الرائدة صفر. حتى في C، 0100 يعني 64، وليس 100، و 08 هو خطأ، وليس 8. للأسف أكثر من ذلك، وقد تم نسخ هذا المفارقة التاريخية إلى ما يقرب من جميع اللغات الحديثة، بما في ذلك جافا سكريبت، حيث يتم استخدامه فقط لخلق أخطاء. ليس له أي غرض آخر. حتى في وضع صارم، لم تعد أشكال ثماني مسموح بها.

إلى آخره

الحجج الزائف صفيف يصبح قليلا أكثر قليلا مثل مجموعة في ES5. في وضع صارم، فإنه يفقد خصائصه callee caller . هذا يجعل من الممكن لتمرير arguments الخاصة بك إلى رمز غير موثوق بها دون التخلي عن الكثير من السياق السري. أيضا، يتم arguments الخاصية arguments من وظائف.

في وضع صارم، سوف مفاتيح مكررة في وظيفة حرفية تنتج خطأ في بناء الجملة. لا يمكن أن تحتوي الدالة على معلمتين بنفس الاسم. لا يمكن أن تحتوي الدالة على متغير يحمل نفس اسم أحد معلماته. لا يمكن وظيفة delete المتغيرات الخاصة بها. محاولة delete خاصية غير قابلة للتكوين الآن تلقي استثناء. القيم الأولية ليست ملفوفة ضمنا.

الكلمات المحجوزة لإصدارات جافا سكريبت المستقبلية

يضيف إكماسكريبت 5 قائمة من الكلمات المحجوزة. إذا كنت تستخدمها كمتغيرات أو وسيطات، فإن وضع صارم رمي خطأ. الكلمات المحجوزة هي:

implements ، interface ، let ، package ، private ، protected ، public ، static ، yield

قراءة متعمقة




وأود أن أقدم جوابا أكثر إيجازا إلى حد ما يكمل الأجوبة الأخرى. كنت آمل في تحرير الإجابة الأكثر شعبية، لكنه فشل. حاولت جعلها شاملة وكاملة كما أستطيع.

يمكنك الرجوع إلى وثائق مدن لمزيد من المعلومات.

"use strict" التوجيه الذي أدخل في إكماسكريبت 5.

التوجيهات تشبه البيانات، ولكن مختلفة.

  • use strict لا تحتوي على الكلمات الرئيسية: التوجيه هو عبارة تعبير بسيط، والذي يتكون من سلسلة خاصة الحرفية (في علامات الاقتباس مفردة أو مزدوجة). محركات جافا سكريبت، التي لا تنفذ إكماسكريبت 5، مجرد رؤية بيان التعبير دون آثار جانبية. ومن المتوقع أن الإصدارات المستقبلية من معايير إكماسكريبت إدخال use كلمة رئيسية حقيقية؛ وبذلك تصبح علامات الاقتباس عفا عليها الزمن.
  • use strict يمكن استخدامها فقط في بداية السيناريو أو وظيفة، أي أنه يجب أن يسبق كل بيان (حقيقي) أخرى. لا يجب أن يكون أول تعليم في نص وظيفة: يمكن أن يسبقه تعبيرات العبارات الأخرى التي تتكون من الحرفية سلسلة (ويمكن لتطبيقات جافا سكريبت التعامل معها على أنها توجيهات تنفيذ محددة). البيانات الحرفية سلسلة، التي تتبع أول بيان حقيقي (في البرنامج النصي أو وظيفة) هي عبارات التعبير بسيطة. يجب على المترجمين الفوريين عدم تفسيرها كتوجيهات وليس لها أي تأثير.

يشير use strict التوجيه use strict إلى أن التعليمات البرمجية التالية (في برنامج نصي أو دالة) هي شفرة صارمة. تعتبر التعليمات البرمجية في أعلى مستوى من البرنامج النصي (رمز غير موجود في دالة) شفرة صارمة عندما يحتوي البرنامج النصي على توجيه use strict . يعتبر محتوى الدالة شفرة صارمة عندما يتم تعريف الدالة نفسها في شفرة صارمة أو عندما تحتوي الدالة على توجيه use strict . تعتبر التعليمات البرمجية التي يتم تمريرها إلى أسلوب eval() رمز صارم عندما تم استدعاء eval() من رمز صارم أو يحتوي على use strict التوجيه use strict نفسه.

وضع صارم من إكماسكريبت 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 المعرفات eval مثل الكلمات الرئيسية. لا يمكنك تغيير قيمتها، ولا يمكن تعيين قيمة لها، ولا يمكنك استخدامها كأسماء للمتغيرات أو الدالات أو معلمات الدالة أو معرفات كتلة الكتلة.
  • في وضع صارم المزيد من القيود على إمكانيات لفحص المكدس الدعوة. TypeError تسبب TypeError في دالة في وضع صارم. وعلاوة على ذلك، بعض المتصل-والحجج خصائص الدالات في وضع صارم يسبب TypeError عند محاولة قراءتها.



سنتى:

واحدة من أهداف وضع صارم هو السماح لتصحيح أسرع من القضايا. أنها تساعد المطورين عن طريق رمي استثناء عندما تحدث بعض الأشياء الخاطئة التي يمكن أن تسبب سلوك صامت وغريب من صفحة الويب الخاصة بك. لحظة نستخدم 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 رمز سوف رمي الخطأ.

أونكوت ريفيرانسيرور: لم يتم تعريف ناموفتري

عينة

يلغي with بيان:

with البيانات لا يمكن أن تكون مفيدة باستخدام أدوات مثل أوجليفي-جس . كما يتم إيقافها وإزالتها من إصدارات جافا سكريبت المستقبلية.

عينة

تمنع التكرارات:

عندما يكون لدينا خاصية مكررة، فإنه يلقي استثناء

سينتاكسيرور أونكوت: خاصية بيانات مكررة في الكائن الحرفي غير مسموح بها في وضع صارم

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

هناك عدد قليل ولكن أكثر أنا بحاجة إلى اكتساب المزيد من المعرفة على ذلك.




إذا كنت تستخدم متصفح صدر في العام الماضي أو نحو ذلك فإنه على الأرجح يدعم وضع جافا سكريبت صارمة. المتصفحات القديمة فقط في جميع أنحاء قبل إكماسكريبت 5 أصبح المعيار الحالي لا يدعم ذلك.

علامات الاقتباس حول الأمر تأكد من أن التعليمات البرمجية سوف لا تزال تعمل في المتصفحات القديمة أيضا (على الرغم من أن الأشياء التي تولد خطأ في بناء الجملة في وضع صارم سوف يسبب فقط البرنامج النصي لخلل في بعض الصعب للكشف عن الطريقة في تلك المتصفحات القديمة).




الوضع المتقن يجعل عدة تغييرات في دلالات جافا سكريبت العادية:

  • يزيل بعض الأخطاء الصامتة جافا سكريبت عن طريق تغييرها لرمي الأخطاء.

  • إصلاح الأخطاء التي تجعل من الصعب على محركات جافا سكريبت لإجراء التحسينات.

  • يحظر بعض بناء الجملة المرجح أن يتم تعريفها في الإصدارات المستقبلية من إكماسكريبت.

لمزيد من المعلومات فيستيت وضع صارم- جافا سكريبت




"استخدام صارم"؛ هو التأمين الذي مبرمج لن تستخدم فضفاضة أو خصائص سيئة من جافا سكريبت. بل هو دليل، تماما مثل حاكم سوف تساعدك على جعل خطوط مستقيمة. "استخدام صارمة" سوف تساعدك على القيام "الترميز على التوالي".

أولئك الذين يفضلون عدم استخدام الحكام للقيام خطوطهم مباشرة تنتهي في نهاية المطاف في تلك الصفحات يطلب من الآخرين لتصحيح التعليمات البرمجية الخاصة بهم.

صدقنى. النفقات العامة لا تذكر بالمقارنة مع التعليمات البرمجية سيئة التصميم. دوغ كروكفورد، الذي كان مطور جافا سكريبت كبار لعدة سنوات، لديه وظيفة مثيرة جدا للاهتمام هنا . شخصيا، أود أن العودة إلى موقعه في كل وقت للتأكد من أنني لا ننسى ممارستي الجيدة.

ممارسة جافاسكريبت الحديثة يجب أن تثير دائما "استخدام صارمة". PRAGMA. والسبب الوحيد الذي جعلت مجموعة إسما وضع "صارم" اختياري هو السماح المبرمجين أقل خبرة الوصول إلى جافا سكريبت وإعطاء الوقت المناسب للتكيف مع ممارسات الترميز الجديدة وأكثر أمانا.




بما في ذلك use strict في بداية جميع ملفات جافا سكريبت الحساسة من هذه النقطة هو وسيلة صغيرة لتكون أفضل مبرمج جافا سكريبت وتجنب المتغيرات العشوائية تصبح عالمية وتغيرت الأمور بصمت.




التوجيه "استخدام صارم"

التوجيه "استخدام صارم" جديد في جافا سكريبت 1.8.5 (إكماسكريبت الإصدار 5).

إنه ليس عبارة، بل تعبير حرفي، يتجاهله الإصدارات السابقة من جافا سكريبت.

الغرض من "استخدام صارم" هو الإشارة إلى أن التعليمات البرمجية يجب أن تنفذ في "وضع صارم".

مع وضع صارم، لا يمكنك، على سبيل المثال، استخدام المتغيرات غير المعلن عنها.

لماذا وضع صارم؟

وضع صارم يجعل من السهل لكتابة "آمنة" جافا سكريبت.

التغييرات وضع صارمة قبول سابقا "جملة سيئة" إلى الأخطاء الحقيقية.

على سبيل المثال، في جافا سكريبت طبيعي، الخطأ في الكتابة اسم متغير يخلق متغير عالمي جديد. في وضع دقيق، وهذا سوف رمي خطأ، مما يجعل من المستحيل لخلق قصد متغير عمومي.

في جافا سكريبت العادي، وسوف المطور لا تتلقى أي ردود فعل الخطأ تعيين قيم لخصائص غير قابل للكتابة.

في الوضع الدقيق للكلمة، أي الاحالة إلى خاصية غير قابل للكتابة، وهي خاصية جالبة الوحيد، وهي غير موجودة الملكية، متغير غير موجود، أو كائن غير موجود، سوف يرمي خطأ.

يرجى الرجوع إلى...

http://www.w3schools.com/js/js_strict.asp

...لمعرفة المزيد




هناك حديث جيد من قبل بعض الناس الذين كانوا في لجنة ECMAScript: التغييرات إلى تفعيل جافا، الجزء 1: ECMAScript 5 " حول كيفية استخدام المتزايد لل "use strict"تبديل يتيح للمنفذين جافا سكريبت لتنظيف الكثير من الميزات خطيرة جافا سكريبت دون كسر فجأة كل موقع فى العالم.

وبطبيعة الحال فإنه يتحدث أيضا عن مجرد ما الكثير من تلك misfeatures هم (كانت) وكيف ECMAScript 5 يحدد لهم.




عند إضافة "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() { } 

مصادر:




"استخدام صارمة" يجعل كود جافا سكربت ليعمل في strict mode، وهو ما يعني أساسا كل شيء تحتاج إلى أن تعرف قبل استخدامها، والسبب الرئيسي ل strict modeهو تجنب الأعراف العالمية عرضية من أي undefinedالأساليب.

أيضا في وضع الدقيق للكلمة، سارت الامور بشكل أسرع، وبعض التحذيرات تحذير أو الأفلام الصامتة، ورمي الأخطاء القاتلة، فإنه من الأفضل دائما استخدامها لجعل رمز أكثر إتقانا.

"استخدام صارمة" وتحتاج على نطاق واسع لاستخدامها في ECMA5، في ECMA6 انها جزء من جافا سكريبت افتراضيا ، لذلك لا تحتاج إلى إضافة إذا كنت تستخدم ES6.

انظروا الى هذه البيانات وأمثلة من MDN:

في "استخدام صارمة" التوجيه
"استخدام صارمة" التوجيه هو جديد في جافا سكريبت 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

لمزيد من المعلومات، يرجى زيارة هذه الصفحة هنا




لاحظ أنه use strictتم تقديمها في EcmaScript 5 وكان يحتفظ منذ ذلك الحين.

وفيما يلي الشروط لتحريك الوضع الصارم في ES6 و ES7 :

  • كود العالمي هو رمز وضع صارم إذا كان يبدأ مع مقدمة التوجيه التي تحتوي على استخدام التوجيه الصارم (انظر 14.1.1).
  • كود الوحدة هو دائما رمز وضع صارمة.
  • جميع أجزاء من ClassDeclaration أو ClassExpression هي رمز وضع صارمة.
  • كود حدة التقييم هو رمز وضع صارم إذا كان يبدأ مع مقدمة التوجيه التي تحتوي على استخدام التوجيه الصارم أو إذا كانت الدعوة إلى وحدة التقييم هي وحدة التقييم المباشر (انظر 12.3.4.1) موجود في رمز وضع صارمة.
  • كود الوظيفة هو رمز وضع صارم إذا كان يرتبط FunctionDeclaration، FunctionExpression، GeneratorDeclaration، GeneratorExpression، MethodDefinition، أو ArrowFunction يرد في رمز وضع صارم أو إذا كان رمز التي تنتج قيمة فتحة الداخلية وظيفة في [[ECMAScriptCode]] يبدأ التوجيه مقدمة التي تحتوي على استخدام التوجيه الصارم.
  • كود الدالة التي يتم توفيره والحجج على وظيفة المدمج في والصانعين مولد هو رمز وضع صارم إذا كانت الوسيطة الأخيرة هي سلسلة أنه عندما معالجتها هو FunctionBody الذي يبدأ مع مقدمة التوجيه التي تحتوي على استخدام التوجيه الصارم.



use strict هي وسيلة لجعل الرمز الخاص بك أكثر أمانا، والسبب لا يمكنك استخدام ميزات الخطيرة التي يمكن أن تعمل ليس كما كنت expect.And كما ريتيد قبل أن يجعل رمز أكثر صرامة.




"استخدام صارمة". هو جهد ECMA لجعل جافا سكريبت قليلا أكثر قوة. لأنه يجمع في JS محاولة لجعله على الأقل قليلا "صارمة" (لغات أخرى تنفذ قواعد صارمة منذ 90s). فعلا "القوات" مطوري جافا سكريبت لمتابعة نوعا من الترميز أفضل الممارسات. ومع ذلك، جافا سكريبت هي هشة للغاية. ليس هناك شيء مثل المتغيرات كتبته، طرق كتابتها، وما إلى ذلك وإنني أوصي بشدة مطوري جافا سكريبت لتعلم لغة أكثر قوة مثل جافا أو ActionScript3، وتنفيذ نفس أفضل الممارسات في شفرة جافا سكريبت، وأنها ستعمل بشكل أفضل ويكون من الأسهل التصحيح.




مثال صغير للمقارنة:

الوضع غير صارم:

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



استخدام يستخدم بشكل صارم لإظهار الأخطاء الشائعة والمتكررة بحيث يتم التعامل معها بشكل مختلف، وتغيير طريقة تشغيل جافا سكريبت، هذه التغييرات هي:

  • يمنع غلوبالس عرضي

  • لا التكرارات

  • يزيل مع

  • يلغي هذا الإكراه

  • وحدة التقييم أكثر أمانا ()

  • أخطاء لimmutables

يمكنك أيضا قراءة هذا المقال للحصول على التفاصيل




عادة جافا سكريبت لا يتبع قواعد صارمة بالتالي زيادة فرص الأخطاء. بعد استخدام "use strict"، يجب رمز جافا سكريبت متابعة مجموعة صارمة من القواعد كما هو الحال في لغات البرمجة الأخرى مثل استخدام الغلق، الإعلان قبل التهيئة الخ

إذا "use strict"تستخدم ثم يجب كتابة التعليمات البرمجية التالية مجموعة صارمة من القواعد وبالتالي تقليل فرص الأخطاء والغموض.




الأسباب الرئيسية لماذا يجب استخدام المطورين "use strict"هي:

  1. يمنع الإعلان عرضي variables.Using العالمية "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. وتقييد استخدامات الكلمات كمتغيرات. تحاول استخدامها سوف رمي الأخطاء.

باختصار سيجعل التعليمات البرمجية أقل عرضة للخطأ، وهذا بدوره سوف تجعلك كتابة التعليمات البرمجية جيد.

لقراءة المزيد حول هذا الموضوع يمكنك الرجوع هنا .




يقدم جافا سكريبت وضع "الصارم" في ECMAScript 5.

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

كتابة "استخدام صارمة". في أعلى جدا من ملف JS الخاص بتشغيل فحص تركيب صارمة. وهو يفعل المهام التالية بالنسبة لنا:

(ط) يظهر خطأ عند محاولة تعيين إلى متغير غير معلنة

(ب) تمنعك من الكتابة المكتبات الرئيسية نظام JS

(ب) تمنع بعض ميزات اللغة غير آمنة أو عرضة للخطأ

"استخدام صارمة" يعمل أيضا داخل ظائف الفردية. هو دائما ممارسة أفضل ليشمل "استخدام صارمة في التعليمات البرمجية.

متصفح التوافق العدد: وتهدف هذه التوجيهات "الاستخدام" لتكون إلى الوراء متوافقة. سوف المتصفحات التي متأكدا دعمهم نرى مجرد سلسلة الحرفي الذي لا المشار أبعد من ذلك. لذلك، فإنها سوف تمر أكثر من ذلك والمضي قدما.




فقط أريد أن أضيف بعض المزيد من النقاط.

السبب لاستخدام وضع الصارم --->

  • وضع صارم يجعل من السهل لكتابة "آمنة" جافا سكريبت.

  • التغييرات وضع صارمة قبول سابقا "جملة سيئة" في الحقيقية
    أخطاء.

  • على سبيل المثال، في جافا سكريبت طبيعي، الخطأ في الكتابة اسم متغير
    يخلق متغير عالمي جديد.

  • في وضع دقيق، وهذا سوف رمي خطأ، مما يجعل من المستحيل لخلق قصد متغير عمومي.

  • في الوضع الدقيق للكلمة، أي الاحالة إلى خاصية غير قابل للكتابة، و
    الملكية جالبة الوحيد، وهي غير موجودة الملكية، وهي غير موجودة
    متغير، أو كائن غير موجود، سوف يرمي خطأ.

الأشياء التي سوف يرمي أخطاء في الوضع الصارم باستخدام متغير، دون أن تعلن ذلك، لا يسمح:

"use strict";
 x = 3.14;                // This will cause an error

الكائنات هي المتغيرات أيضا.

باستخدام كائن، دون أن تعلن ذلك، لا يسمح:

  "use strict";
  x = {p1:10, p2:20};      // This will cause an error

حذف متغير (أو كائن) غير مسموح به.

  "use strict";
   var x = 3.14;
   delete x;                // This will cause an error

لأسباب أمنية، لا يسمح حدة التقييم () لإنشاء المتغيرات في نطاق من الذي كان يطلق عليه:

"use strict";
 eval ("var x = 2");
 alert (x);               // This will cause an error

في المكالمات وظيفة مثل و ()، وكانت هذه القيمة الكائن العالمي. في وضع دقيق، وغير معروف الآن ذلك.

"استخدام صارمة" لا تعترف بها سوى في بداية السيناريو.