هل يمكنني تعطيل الوضع الصارم لـ ECMAscript لوظائف محددة؟

StackOverflow https://stackoverflow.com/questions/6020178

سؤال

لم أجد أي شيء عن سؤالي هنا فيما يتعلق بمواصفات MDC أو ECMAscript.ربما يعرف شخص ما طريقة أكثر "اختراقًا" لحل هذه المشكلة.

انا اتصل "use strict" في كل ملف جافا سكريبت في بيئتي.كل ملفاتي تبدأ بهذا الشكل

(function(win, doc, undef) {
    "use strict";

    // code & functions
}(window, window.document));

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

var chain = (function() {
    var _parent = _error,
        _ret = '';

    while( _parent.caller ) {
        _ret += ' -> ' + _parent.caller.name;
        _parent = _parent.caller;
    }

    return _ret;
}());

ولكن بالطبع، في الوضع الصارم .caller هي دعامة غير قابلة للحذف والتي يتم طرحها عند استرجاعها.لذلك سؤالي هو، هل هناك من يعرف الطريقة لذلك إبطال أكثر صرامة "من حيث الوظيفة"؟

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

هل كانت مفيدة؟

المحلول

لا يمكنك تعطيل الوضع الدقيق لكل وظيفة.

من المهم أن نفهم أن الوضع الدقيق يعمل بشكل معجمي;— معنى ذلك يؤثر على وظيفة الإعلان, عدم التنفيذ.أي وظيفة أعلن ضمن قواعد صارمة يصبح صارمة الوظيفة نفسها.ولكن ليس أي وظيفة دعا من ضمن قواعد صارمة بالضرورة صارمة:

(function(sloppy) {
  "use strict";

   function strict() {
     // this function is strict, as it is _declared_ within strict code
   }

   strict();
   sloppy();

})(sloppy);

function sloppy(){
  // this function is not strict as it is _declared outside_ of strict code
}

لاحظ كيف يمكننا تحديد وظيفة خارج قواعد صارمة ومن ثم تمريرها إلى الدالة التي الصارم.

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

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

(function(){
  "use strict";

  function whichDoesSomethingNaughty(){ /* ... */ }

  // ReferenceError as function is not globally accessible
  // and indirect eval obviously tries to "find" it in global scope
  (1,eval)('whichDoesSomethingNaughty')();

})();

هذا الارتباك حول العالمية eval ربما يأتي من حقيقة أن العالمية eval يمكن استخدامها للوصول إلى كائن العالمية من خلال وضع الصارم (التي ليست ببساطة يمكن الوصول إليها عبر this بعد الآن):

(function(){
  "use strict";

  this; // undefined
  (1,eval)('this'); // global object
})();

ولكن نعود إلى السؤال...

يمكنك نوع من الغش و تعلن وظيفة جديدة عن طريق Function منشئ — الذي يحدث لا ترث التشدد ، ولكن هذا سيعتمد على (غير القياسية) وظيفة وبتفريغ وكنت تفقد القدرة على المراجع الخارجي المتغيرات.

(function(){
  "use strict";

  function strict(){ /* ... */ }

  // compile new function from the string representation of another one
  var sneaky = Function('return (' + strict + ')()');

  sneaky();
})();

علما بأن FF4+ يبدو أن نختلف مع المواصفات (من ما أستطيع أن أقول) بشكل غير صحيح علامات وظيفة التي تم إنشاؤها عن طريق Function كما الصارمة.هذا لا يحدث في الأخرى الصارم-وضع-دعم تطبيقات (مثل كروم 12+, IE10, بكت).

نصائح أخرى

(من http://javascriptweblog.wordpress.com/2011/05/03/javascript-strict-mode/)

(...) لا يتم فرض الوضع الصارم على وظائف غير متجانسة يتم استدعاؤها داخل جسم وظيفة صارمة (إما تم تمريرها كوسائط أو استدعاء باستخدامها call أو apply).

لذا، إذا قمت بإعداد أساليب الخطأ في ملف مختلف، بدون الوضع الصارم، ثم قمت بتمريرها كمعلمة، مثل هذا:

var test = function(fn) {
  'use strict';
  fn();
}

var deleteNonConfigurable = function () {
  var obj = {};
  Object.defineProperty(obj, "name", {
    configurable: false
  });
  delete obj.name; //will throw TypeError in Strict Mode
}

test(deleteNonConfigurable); //no error (Strict Mode not enforced)

...يجب أن تعمل.

بديل هو ببساطة القيام بذلك giveacodicetagpre.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top