الوضع الدقيق هو القادمة الى المدينة

14 ديسمبر 2010 في 14:12 من قبل دوغلاس Crockford | في تطوير | 20 التعليقات

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

تحديد الوضع الدقيق

هناك طريقتان لطلب وضع صارمة. الأول هو لادخال هذا pragma

  "استخدام الدقيق"؛ 

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

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

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

  (وظيفة () {
    "استخدام الدقيق"؛
    / / وظيفة هذا هو صارمة ...
 } ())؛

 (وظيفة () {
    / / ولكن هذه هي وظيفة قذرة ...
 } ())؛ 

مجال

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

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

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

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

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

عالمي التسرب

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

صاخبة الفشل

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

ثماني

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

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

وهلم جرا

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

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

إذا كان البرنامج يمر JSLint ، وأنها ستعمل على الارجح في وضع الصارمة.

لا يزال عالم غير كامل

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

لماذا مسائل الوضع الصارم

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

طريقة صارمة لا يحل مشكلة XSS. الحل لهذه المشكلة يعتمد على W3C اتخاذ بعض الإجراءات الإيجابية .

ES5/strict الآن في معاينات، وسيتم قريبا المعدات القياسية في جميع المتصفحات المتوافقة مع المعايير في كل مكان.

تقاسم وتوسيع نطاق: مع الإشارة المرجعية متواجد حاليا | يسو أنها! | صديق!

20 التعليقات

  1. كما آخر رهيبة كالعادة! ES5 هو المستقبل .. Object.create ()، Object.defineProperty ()، Object.isExtensible ()، Array.isArray ()، الوطنية لدعم JSON هي الميزات الرائعة .. التحقق من ADsafe، تبدو واعدة

    تعليق بواسطة Armeli سيباستيانو - 14 ديسمبر 2010 #

  2. إذا arguments.callee خارج، هل هناك طريقة أخرى من الرجوع إلى امدا من جسمها؟

    تعليق من قبل أرييه - 15 ديسمبر 2010 #

  3. هل هناك أي برامج التصفح (بيتا أو لا) التي هي صارمة تماما متوافقة مع الوضع؟

    تعليق من قبل نيت - 15 ديسمبر 2010 #

  4. @ ارييه، نعم -

    var carl = function bob(a) {
    if (!a) { bob(1); } // reference scoped to inside this function
    alert(carl === bob); // gotcha - true in all browsers but false in ie...
    };

    تعليق من قبل كريس - 15 ديسمبر 2010 #

  5. ارييه: يمكنك تسمية وظيفة التعبير والرجوع إليها من قبل بهذا الاسم. على سبيل المثال var x = function lookMaNoYCombinator(a, b) { if (a === 0) return a + b; else return lookMaNoYCombinator(a - 1, b) }

    تعليق بواسطة Samhuri سامي - 15 ديسمبر 2010 #

  6. @ ارييه: يجب أن تكون مستخدما لامدا اسمه إذا كنت تريد أن عنة. على سبيل المثال. (وظيفة و () {و ()}). هذا أيضا لديه ميزة عدم ربط وسيطات الاعتراض على | هذا |

    تعليق من قبل أوليفر - 15 ديسمبر 2010 #

  7. @ نيت: يجب أن يبني ليلا من بكت وفايرفوكس على حد سواء تكون صارمة متوافقة مع الوضع، ونحن نقدر كل يجري رفعها الخلل إذا وجدت أي (في http://bugs.webkit.org و http://bugs.mozilla.org)

    تعليق من قبل أوليفر - 15 ديسمبر 2010 #

  8. ويمكن الاطلاع على المخطط كبير يظهر ES5 التوافق في مختلف برامج التصفح هنا: http://kangax.github.com/es5-compat-table/

    تعليق بواسطة جيمي - 15 ديسمبر 2010 #

  9. 'ب' وحقن EVAL لم تنفذ حقا ملزم ديناميكي . ES3 كامل حتى يستخدم ملزم معجمي (وإن لم يكن بالضرورة ثابت ملزم) في جميع الحالات. وهذه الميزات مربكا بالتأكيد، وإن كان.

    تعليق من قبل ديفيد، سارة هوبوود - 16 ديسمبر 2010 #

  10. مرحبا دوغلاس،

    نظرة عامة جيدة، وذلك بفضل. وبالإضافة إلى ذلك، وأنا متأكد سوف تكون مهتمة القراء في وصف الوضع الدقيق المفصل: http://dmitrysoshnikov.com/ecmascript/es5-chapter-2-strict-mode/

    ملاحظة: زوج من الإضافات / تصحيحات:

    ويمكن لوظيفة لم يكن لديك متغير مع نفس اسم واحدة من معالمها.

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

    ويمكن ليست وظيفة حذف المتغيرات الخاصة به.

    كان دائما هكذا - المتغيرات (ما عدا تلك التي تم إنشاؤها باستخدام eval السياق) دائما {} DontDelete في ES3 / [[شكلي]] = خطأ في ES5. أي انه لا يمكن حذف متغير بغض النظر عن طريقة صارمة.

    ديمتري.

    تعليق من قبل ديمتري ألف Soshnikov - 17 ديسمبر 2010 #

  11. وسوف YUI3 إضافة "استخدام صارمة" إلى وحدات لها؟

    تعليق من قبل ديفيد - 17 ديسمبر 2010 #

  12. مرحبا دوغلاس،

    أنا حائرة في بيان من دون هذه المشاركة.

    "الوضع الدقيق يتطلب أن يتم كل ملزم المتغير بشكل ثابت. وهذا يعني أن الميزات التي يجب القضاء ملزم الديناميكية المطلوبة من قبل أو تعديلها ".

    الكلمة "هذا" - هل لديها ديناميكية ملزم ملزم أو معجمية (ثابت)؟

    إذا كان هو وجود دينامية ملزم، هل يقصد أن يقول أن نتوقف عن استخدام 'هذا' في الوضع الدقيق؟

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

    ولكن فقط نريد أن نسمع منك في شك 'هذا'.

    شكرا

    تعليق بواسطة ekanna - 28 ديسمبر 2010 #

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

    تعليق بواسطة Crockford دوغلاس - 29 ديسمبر 2010 #

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

    وديفيد، سارة، الشعر كنت تقسيم قصيرة جدا.

    تعليق بواسطة Crockford دوغلاس - 29 ديسمبر 2010 #

  15. بفضل دوغلاس.

    تعليق بواسطة ekanna - 7 يناير 2011 #

  16. قد ترغب في تصحيح الخطأ المطبعي في "فشل ضجيجا" المقطع "createProperty" يجب "defineProperty".

    تعليق بواسطة Travis - 11 يناير 2011 #

  17. "رهيبة للغاية"

    تعليق بواسطة enzenhofer فرانز - 13 يناير 2011 #

  18. Crockford rockz!

    تعليق بواسطة دراكو مارك - يناير 20، 2011 #

  19. لذلك، سوف تتوقف عندما YUI ضاغط اسقاط "استخدام صارمة"؛ pragma من خلال رمز minifaction؟ :)

    تعليق بواسطة marcoos - 3 فبراير 2011 #

  20. ق / minifaction / minification /

    تعليق بواسطة marcoos - 3 فبراير 2011 #

آسف، يتم إغلاق شكل تعليق في هذا الوقت.

استضاف برنامج رائع

جميع الحقوق محفوظة © 2006-2012 ياهو! جميع الحقوق محفوظة. سياسة الخصوصية - شروط الخدمة

مدعوم من وورد في ياهو! استضافة المواقع .