صادفت هذا المقال يشرح JavaScript Quiz-Legend. على أي حال ، لا بأس ، لذلك أريد أن أحضرها إلى هنا حتى يتعلم الجميع ، وفهمهم ، وقابلتهم ، والانتقاد.
السؤال 1
(function () {return typeof mations ؛ // "object"}) () ؛الوسائط هي كائن يشبه المصفوفة ، يتوافق مع قائمة المعلمة للوظيفة التي تم تمريرها. يمكنك استخدام هذا المتغير مباشرة في أي وظيفة.
سيعود مشغل typeof فقط نتائج سلسلة النوع. ارجع إلى القائمة التالية لمعرفة القيمة التي يتم إرجاعها بواسطة TypeOF هي البيانات المختلفة المقابلة:
من هذا نستنتج أن الحجج typeof هي كائن
السؤال 2
var f = function g () {return 23 ؛ } ؛ typeof g () ؛ // الإبلاغ عن خطأهذا تعبير دالة مع الاسم G ، ثم يتم تعيينه للمتغير f.
اسم الوظيفة G هنا والمتغير F المعين به له الاختلافات التالية:
لا يمكن تغيير اسم الوظيفة G ، في حين يمكن إعادة تعيين المتغير F
لا يمكن استخدام اسم الوظيفة G إلا داخل جسم الوظيفة. إذا حاولت استخدام G خارج الوظيفة ، فسيتم الإبلاغ عن خطأ.
السؤال 3
(Function (x) {delete x ؛ return x ؛ // 1}) (1) ؛يمكن لمشغل الحذف حذف السمات من كائن ، والاستخدام الصحيح هو كما يلي:
حذف Object.Property
حذف كائن ['property']
لا يمكن استخدام مشغل الحذف إلا في خصائص الكائن ولا يعتبر غير صالح للمتغيرات وأسماء الوظائف. وهذا يعني ، حذف X لا معنى له.
من الأفضل أن تعرف أن DELETE لن يتم تحرير الذاكرة مباشرة ، فهي تقاطع مرجع الكائن بشكل غير مباشر بشكل غير مباشر
السؤال 4
var y = 1 ، x = y = typeof x ؛ x ؛ // "غير محدد"
نحاول تقسيم الكود أعلاه إلى الخطوتين التاليتين:
var y = 1 ؛ // الخطوة 1
var x = y = typeof x ؛ // الخطوة 2
يجب ألا يكون هناك اعتراض على الخطوة الأولى ، دعونا ننظر إلى الخطوة الثانية مباشرة
1. يتم تنفيذ تعبيرات المهمة من اليمين إلى اليسار
2. نتيجة إعادة تعيين y إلى typeof x ، أي ، غير محدد
يتم تعيين 3.x كنتيجة للتعبير الصحيح (y = typeof x) ، أي ، غير محدد
السؤال 5
(الدالة f (f) {return typeof f () ؛ // "number"}) (function () {return 1 ؛}) ؛شرح التعليق المباشر:
(الوظيفة f (f) {// f هنا هي المعلمة التي تم تمريرها في الدالة () {return 1 ؛} // نتيجة التنفيذ هي بشكل طبيعي 1 نوع إرجاع f () ؛ // لذلك وفقًا للجدول المعني ، نعلم أن النتيجة النوع 1 هي "الرقم") (الدالة () {return 1 ؛}) ؛السؤال 6
var foo = {bar: function () {return this.baz ؛ } ، baz: 1} ؛ (function () {return typeof mations [0] () ؛ // "undefined"}) (foo.bar) ؛هنا قد تعتقد عن طريق الخطأ أن النتيجة النهائية هي رقم. يمكن اعتبار تمرير المعلمات إلى وظيفة مهمة ، لذلك تحصل الوسيطات [0] على قيمة وظيفة الشريط الحقيقي ، بدلاً من الإشارة إلى foo.bar ، لذلك لن يشير هذا إلى Foo ، ولكن نافذة.
السؤال 7
var foo = {bar: function () {return this.baz ؛ } ، baz: 1} typeof (f = foo.bar) () ؛ // "غير محدد"هذه هي نفس المشكلة مثل السؤال السابق. (f = foo.bar) إرجاع قيمة الشريط ، وليس مرجعه ، لذلك لا يشير هذا إلى FOO.
السؤال 8
var f = (function f () {return '1' ؛} ، function g () {return 2 ؛}) () ؛ typeof f ؛ // "number"يقوم مشغل الفاصلة بتقييم كل من كائنات التشغيل الخاصة به (من اليسار إلى اليمين) ويعيد قيمة كائن التشغيل الأخير.
لذا فإن قيمة الإرجاع لـ (function f () {return '1' ؛} ، function g () {return 2 ؛}) هي وظيفة g ، ثم تنفيذها ، ثم النتيجة هي 2 ؛ أخيرًا من النوع 2 ، وفقًا للجدول المعني ، فإن النتيجة هي رقم طبيعي
السؤال 9
var x = 1 ؛ if (function f () {}) {x += typeof f ؛} x ؛ // "1Undefined"النقطة الرئيسية لهذه المشكلة ، ذكرنا في السؤال 2 ، لا يمكن الوصول إلى اسم الوظيفة F في تعبير الوظيفة خارج جسم الوظيفة.
سؤال 10
var x = [typeof x ، typeof y] [1] ؛ typeof typeof x ؛ // "السلسلة" 1. لأنه لم يتم الإعلان عن المتغير y ، يعود النوع y "غير محدد"
2. قم بتعيين نتيجة typeof y إلى x ، أي أن x الآن "غير محدد"
3. ثم typeof x بالطبع "سلسلة"
4. النتيجة النهائية لنوع "السلسلة" لا تزال "سلسلة" بشكل طبيعي
السؤال 11
(function (foo) {return typeof foo.bar ؛ // "undefined"}) ({foo: {bar: 1}}) ؛هذه خدعة بصرية خالصة ، علق
(Function (foo) {// foo هنا هو {foo: {bar: 1}} ، ولا توجد سمة شريط.السؤال 12
(الدالة f () {function f () {return 1 ؛} return f () ؛ // 2 function f () {return 2 ؛}}) () ؛يمكن استخدام الوظائف التي تم إعلانها من خلال إعلان الوظيفة قبل الإعلان ، والتي نسميها هذه الميزة الرفع. لذلك يتم شرح الكود أعلاه بالفعل من خلال البيئة الجري مثل هذا:
(الدالة f () {function f () {return 1 ؛} function f () {return 2 ؛} return f () ؛}) () ؛السؤال 13
وظيفة f () {return f ؛ } new f () مثيل f ؛ // falseعندما يتم تنفيذ الكود الجديد f () ، سيحدث ما يلي:
1. يتم إنشاء كائن جديد. يرث من النمط f.proty
2. يتم تنفيذ المنشئ F. أثناء التنفيذ ، سيتم تمرير التمريرة المقابلة ، وسيتم تحديد السياق (هذا) على أنه مثيل جديد. الجديد F يعادل F () الجديد ولا يمكن استخدامه إلا في الحالات التي لا يتم فيها تمرير أي معلمات.
3. إذا قام المُنشئ بإرجاع "كائن" ، فسيحل هذا الكائن محل نتيجة الجديد بالكامل. إذا لم يرد المنشئ الكائن ، فإن نتيجة جديدة هي الكائن الذي تم إنشاؤه في الخطوة 1.
PS: في ظل الظروف العادية ، لا يقوم المنشئ بإرجاع أي قيمة ، ولكن إذا أراد المستخدم الكتابة فوق قيمة الإرجاع هذه ، فيمكنه اختيار إرجاع كائن عادي للكتابة فوقه. بالطبع ، سيتم كتابة المصفوفات العائدة أيضًا ، لأن المصفوفات هي أيضًا كائنات.
لذلك ، لا نزال هنا f () نرد الوظيفة f نفسها ، وليس مثيلها
السؤال 14
مع (وظيفة (x ، غير محدد) {}) الطول ؛ // 2
يضيف البيان كائن إلى أعلى سلسلة النطاق. إذا كان هناك متغير لم يستخدم مساحة اسم في العبارة ، والتي لها نفس اسم خاصية في سلسلة النطاق ، سيشير المتغير إلى قيمة الخاصية. إذا كان هناك خاصية تحمل نفس الاسم ، فسيتم إصدار استثناء مرجعية.
حسنًا ، دعونا الآن ننظر إليها ، نظرًا لأن الوظيفة (x ، غير محددة) {} هي تعبير دالة مجهول ، وهو دالة ، سيكون لها سمة طول ، تشير إلى عدد معلمات الوظيفة. لذا فإن النتيجة النهائية هي 2
مكتوب في النهاية
يعتقد بعض الناس أن هذه الأسئلة صعبة ، بينما يعتقد آخرون أنها توسع آفاقهم وتعتمد على آرائهم. لكن هناك شيء واحد صحيح. سواء كنت ممارسًا ثابتًا أم لا ، فأنت بالتأكيد لن تذهب بعيدًا بدون أساس نظري - فلن ترى أبدًا أي عامل تقني ماهر أصبح فجأة خبيرًا في الصواريخ.
قراءة المستندات ، ومعايير القراءة ، والجمع بين الممارسة هي الطريقة الحاسمة للرفاق.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.