تتنافس مع JS "المستخدمة قبل المحددة" ومطور التيتانيوم

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

  •  24-09-2019
  •  | 
  •  

سؤال

لدي ملف JavaScript طويل يمرر JSlint باستثناء "استخدامه قبل تعريفه".

لقد استخدمت إعلانات الوظيفة العادية ، كما في ...

function whatever() {do something;}

في مقابل...

var whatever = function(){do something;};

ومتسقة مع رد ستيف هاريسون إلى منشور سابق ...

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

... أحب رؤية الوظائف بترتيب منطقي بالنسبة لي.

يعمل البرنامج النصي بشكل مثالي في العديد من المتصفحات التي تم اختبارها (على سبيل المثال ، Firefox ، Safari ، Safari Mobile ، Fennec ، IE ، Chrome ، Midori ، إلخ).

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

كيف يمكنني الالتفاف حول هذا؟

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

function buildMenu(){
     Display a list of five menu items, each of which calls a function to build the associated screen.
}

function screen1() {
     Display the screen associated with menu item #1.
}

إذا كانت الوظائف تحتاج إلى إعلان بالترتيب ، function screen1 سوف تحتاج إلى أن تسبق function buildMenu. ولكن ماذا لو ، في ظل ظروف معينة ، لا يمكن بناء Screen1 وبالتالي يريد إعادة تشغيل القائمة (أي استدعاء وظيفة لم يتم إعلانها تقنيًا بعد)؟

أوه نعم ... سؤال واحد آخر: هل هناك مواقع أو برامج تعيد تلقائيًا تلقائي الوظائف بدلاً من مطالبة المبرمج للقيام بذلك يدويًا؟

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

المحلول

لا ، إجابة EM ليست الحل الصحيح. حاول تشغيل هذا JavaScript:

(function () {
   foo(); // right

   var foo = function () {
     console.log("wrong");
   };

   foo(); // wrong

   function foo() {
     console.log("right");
   }

   foo(); // wrong
}());

هذا لأن المترجم المترجم سيقرأ أولاً إعلان الوظيفة ، وإنشاء الاسم foo كدالة تطبع "صحيح" ، ثم تقرأ var بيان ، وتجد أن هناك بالفعل اسم foo لذلك سوف يتخطى إنشاء متغير جديد مع القيمة undefined, ، كما يحدث عادة. ثم يقوم بمعالجة الكود ، خط تلو الآخر ، والذي يتضمن مهمة ل foo. إعلان الوظيفة لا يتم إعادة معالجته. ربما سيتصرف هذا بشكل مختلف في التيتانيوم ، لكن جرب هذا في Firebug وستحصل على ما حصلت عليه.

حل أفضل هو:

var screen1, buildMenu;

screen1 = function () { buildMenu(); };
buildMenu = function () { screen1(); };

سيؤدي ذلك أيضًا إلى مرور JSlint ، وينتج السلوك الصحيح.

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