سؤال

لدينا تطبيق جافا سكريبت كبير جدًا، حيث بعد عدة أشهر من البرمجة، ظهرت حتمًا بعض الأخطاء في النطاق حيث يتم تعريف المتغير دون استخدام var الكلمة المفتاحية على النحو التالي:

function() {  
  x = 5; ...  
}

بدلاً من:

function() {  
  var x = 5; ...  
}

يحدث هذا في مكان ما - لسنا متأكدين من مكانه - والبحث عن اسم المتغير المعني أمر صعب، نظرًا لأنها كلمة شائعة تظهر آلاف المرات في مصدرنا.

هل هناك طريقة لمطالبة Firebug بالتوقف عن السطر الذي يقوم أولاً بإنشاء متغير عالمي معين؟للتوضيح، أود أن أتوقف في اللحظة التي بالضبط window.x يتحول من undefined إلى قيمة محددة، وكسر البيان.

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

إذا لم يكن هذا ممكنًا مع Firebug، سأكون مهتمًا بأي شيء يمكنه تحقيق ذلك في Firefox بشكل عام.

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

المحلول

قدمت بعض الأشياء

  1. أنت تعرف اسم المتغير
  2. ليس لديك متغير بهذا الاسم في النطاق العام (الوظائف الخارجية المعلنة)، ولكن فقط الوظائف الداخلية.
  3. هناك استدعاءات للدالة التي تعلن عن المتغير.

هذا النص الصغير سيفي بالغرض:

<script type="text/javascript">
window.__defineSetter__("x", function(value) { console.trace(); });
x = 1;
</script>

ستحصل على تتبع للتعليمات البرمجية التي تم تنفيذها قبل تلك المهمة.

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

نصائح أخرى

وهنا حل آخر يعمل فقط في فايرفوكس لأنه يستخدم فايرفوكس محددة <لأ href = "https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/watch" يختلط = "نوفولو"> طريقة watch .

ووضع هذه القطعة من جافا سكريبت في أعلى جدا من صفحة HTML الخاصة بك، فقط بعد علامة <head>:

<script>
window.watch('x', function() { debugger });
</script>

لاحظ أن يعمل watch على أي كائن جافا سكريبت (window هو كائن جافا سكريبت العالمي).

وهنا الحل انتهى بي الأمر باستخدام بتعديل حل يونوت G. ستان:

window.__defineSetter__("name", function(value) {
  if (value=="div") {
    debugger;
  }
});

واعتدت debugger بدلا من console.trace()، حتى أتمكن من التوقف وننظر في الأمر منتصف التنفيذ. مع console.trace() حصلت على bazillion تتبع البيانات بسبب هذا الخط تنفيذ عدة مرات.

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

وعرض صفحة الويب الخاصة بك على المتصفح إضافات (I استخدام الإصدار 1.1.16) والبحث في وحدة التحكم الخطأ، سوف ترى رسالة من هذا النوع لكل التعيين إلى متغير غير معلن:

Warning: assignment to undeclared variable x
Source File: http://....js
Line: ##

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

وهناك العديد من حزم سطر الأوامر من jslint، مثل jslint4java التي يمكن استخدامها عبر منصة في النملة بناء البرامج النصية .

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