1: نطاق النطاق
نسخة الكود كما يلي:
(وظيفة() {
var a = b = 5 ؛
}) () ؛
console.log (b) ؛
ماذا سيتم طباعته على وحدة التحكم؟
إجابة
سوف الرمز أعلاه طباعة 5.
الحيلة لهذه المشكلة هي أن هناك إعلانات متغيرة هنا ، ولكن تم إعلانها باستخدام الكلمة الرئيسية VAR. يمثل أنه متغير محلي للدالة. في المقابل ، يصبح B متغيرًا عالميًا.
خدعة أخرى لهذه المشكلة هي أنها لا تستخدم الوضع الصارم ("استخدم صارم" ؛). إذا تم تمكين الوضع الصارم ، فسيقوم الرمز برفع خطأ مرجعية: B غير محدد. تذكر أن الوضع الصارم ، تحتاج إلى تحديد صراحة من أجل تنفيذ إعلانات متغير عالمي. على سبيل المثال ، يجب أن تكتب:
نسخة الكود كما يلي:
(وظيفة() {
"استخدام صارم" ؛
var a = window.b = 5 ؛
}) () ؛
console.log (b) ؛
2: إنشاء طريقة "أصلية"
تحديد وظيفة تكرار لكائن السلسلة. عندما يتم تمرير عدد صحيح n ، فإنه يعيد نتيجة السلسلة المتكررة n. على سبيل المثال:
نسخة الكود كما يلي:
console.log ('hello'.repeatify (3)) ؛
يجب طباعة HelloHelloHello.
إجابة
التنفيذ المحتمل هو كما يلي:
نسخة الكود كما يلي:
string.prototype.repeatify = string.prototype.repeatify || وظيفة (مرات) {
var str = '' ؛
لـ (var i = 0 ؛ i <times ؛ i ++) {
str += هذا ؛
}
إرجاع شارع
} ؛
المشكلة الحالية تختبر نقاط المعرفة للمطورين حول ميراث JavaScript والنموذج الأولي. يتحقق هذا أيضًا مما إذا كان المطور يعرف ما إذا كان الكائن المدمج تم تمديده (على الرغم من أنه لا ينبغي القيام بذلك).
نقطة أخرى هنا هي أنك تحتاج إلى معرفة كيفية عدم تجاوز الوظيفة التي قد تكون محددة. اختبار تعريف الوظيفة غير موجود من قبل:
نسخة الكود كما يلي:
string.prototype.repeatify = string.prototype.repeatify || دالة (مرات) {/ * الكود هنا */} ؛
هذه التقنية مفيدة بشكل خاص عندما يُطلب منك أن تكون متوافقًا مع وظائف JavaScript.
3: إعلان الترويج (الرفع)
تنفيذ هذا الرمز وإخراج النتيجة.
نسخة الكود كما يلي:
اختبار الوظيفة () {
console.log (a) ؛
console.log (foo ()) ؛
var a = 1 ؛
وظيفة foo () {
العودة 2 ؛
}
}
10: اختبار () ؛
إجابة
نتيجة هذا الرمز غير محدد و 2.
والسبب هو أن كلا من المتغير وإعلان الوظيفة قد تم تطويره (تم نقله إلى الجزء العلوي من الوظيفة) ، لكن المتغير لا يعين أي قيمة. لذلك عند طباعة المتغير ، فإنه موجود في الوظيفة (يتم إعلانه) ، لكنه لا يزال غير محدد. بمعنى آخر ، فإن الكود أعلاه يعادل ما يلي:
نسخة الكود كما يلي:
اختبار الوظيفة () {
var a ؛
وظيفة foo () {
العودة 2 ؛
}
console.log (a) ؛
console.log (foo ()) ؛
أ = 1 ؛
}
امتحان()؛
4: كيف يعمل هذا في JavaScript
ما هي النتائج التي سيخرج الكود التالي؟ أعط إجابتك.
نسخة الكود كما يلي:
var fullname = 'John Doe' ؛
var obj = {
FullName: 'Colin Ihrig' ،
الدعامة: {
FullName: 'Aurelio de Rosa' ،
getfullname: function () {
إرجاع this.fullname ؛
}
}
} ؛
console.log (obj.prop.getfullname ()) ؛
var test = obj.prop.getfullname ؛
console.log (test ()) ؛
إجابة
الإجابات هي Aurelio de Rosa و John Doe. والسبب هو أنه في وظيفة ما ، يعتمد سلوك هذا على كيفية استدعاء وظيفة JavaScript وتحديدها ، وليس فقط كيف يتم تعريفها.
في مكالمة console.log () الأولى ، يُطلق على getfullname () كدالة لكائن obj.prop. لذلك ، يشير السياق إلى الأخير ، وإرجاع الوظيفة اسم الكائن الكامل. في المقابل ، عند تعيين GetFullName () إلى متغير الاختبار ، يشير السياق إلى الكائن العالمي (نافذة). هذا لأن الاختبار هو سمة يتم تعيينها ضمنيًا ككائن عالمي. لهذا السبب ، تقوم الوظيفة بإرجاع اسم النافذة الكامل ، أي القيمة المحددة على السطر الأول.
5: Call () و تطبيق ()
دعك الآن تحل المشكلة السابقة وقم بإعداد وحدة التحكم الأخيرة.
إجابة
يمكن أن تغير المشكلة سياق الوظيفة عن طريق فرض Call () أو تطبيق (). أدناه سأستخدم Call () ، ولكن في هذه الحالة ، سيتم تطبيق النتيجة نفسها:
نسخة الكود كما يلي:
console.log (test.call (obj.prop)) ؛