سؤال

مهلا لدي هذا الرمز هنا:http://pastie.org/534470.

وعلى الخط 109 أحصل على خطأ يقول "TypeError: نتيجة التعبير" this.allvarsDefined [غير محدد] ليست وظيفة".

النطاق في جافا سكريبت مربكة لي. هل يمكن لأي شخص أن يرى ما هي مشكلتي؟ كما تعلمون يا رفاق من أي مقالات تساعدني في معرفة النطاق في جافا سكريبت. هذه هي المرة الأولى التي تستخدم فيها JS :)

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

المحلول

هذا يبدو النموذج الأولي. ربما تحتاج إلى إعداد رد الإشعار الخاص بك مثل هذا:

setTimeout(this.notify.bind(this), 5000, track);

بحيث تكون وظيفة الإخطار ملزمة كائن Scrobbler ويحصل this اضبط على كائن Scropbler بدلا من الحدث الذي يؤدي إلى تشغيل الوظيفة عند حدوث المهلة.

إذا كنت مخطئا عليك باستخدام النموذج الأولي، فمن المحتمل أن تحقق نفس التأثير باستخدام

var that = this;
setTimeout( function() { that.notify(); }, 5000, track );

نصائح أخرى

حاول تغيير الخط 109 من

setTimeout(this.notify, 5000, track);

ل

setTimeout(function(){this.notify()}, 5000, track);

ما سيفعله هذا هو إنشاء "إغلاق" (وظيفة "() {this.notify ()}) الذي يتضمن" هذا "المتغير فيه، و" هذا "يتضمن هذا.allvarsdefined، لذلك يجب عليك التوقف عن الحصول على هذا الخطأ.

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

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

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

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