الأقواس لها أربع وظائف دلالية في JS
دلالات 1، تنظيم الجمل المركبة، وهذا هو الأكثر شيوعا
انسخ رمز الكود كما يلي:
إذا (الشرط) {
//...
}آخر {
//...
}
ل() {
//...
}
دلالات 2، الإعلان الحرفي للكائن
انسخ رمز الكود كما يلي:
فار أوبج = {
الاسم: "جاك"،
العمر: 23
};
الأمر برمته عبارة عن بيان إسناد، حيث يكون {name:'jack',age:23} تعبيرًا.
دلالات 3، أعلن عن وظيفة أو وظيفة حرفية
انسخ رمز الكود كما يلي:
الدالة f1(){
//...
}
فار f2 = وظيفة(){
//...
}
الفرق بين f1 وnon-f2 هو أن الأول يكون في فترة تفسير بناء الجملة والأخير يكون في وقت التشغيل. الفرق هو: إذا كان الكود الذي يستدعي الوظيفة بعد تعريف الوظيفة، فلا يوجد فرق إذا كان الكود الذي يستدعي الوظيفة قبل تعريف الوظيفة، فلا يزال من الممكن استدعاء f1، لكن f2 سيبلغ عن خطأ، مما يطالب بذلك؛ لم يتم تعريف f2.
دلالات 4، تدوين بناء الجملة لمعالجة الاستثناءات المنظمة
انسخ رمز الكود كما يلي:
يحاول {
//...
}قبض(على سبيل المثال){
//...
}أخيراً{
//...
}
هناك فرق بين الأقواس هنا والبيان المطابق (الدلالي 1). إذا كان هناك عبارة واحدة فقط بين الأقواس، فيمكن حذف الأقواس في if/else/for، وما إلى ذلك، ولكن لا يمكن حذف محاولة/catch/أخيرًا. تم حذفه.
لقد كنت أعاني من الكود التالي لفترة طويلة
انسخ رمز الكود كما يلي:
function(){}() // يتم تنفيذ الوظيفة المجهولة على الفور، والتقرير الدوري لتحليل بناء الجملة
{}.constructor // احصل على مُنشئ الكائن الحرفي، وسيتم الإبلاغ عن خطأ أثناء تحليل بناء الجملة
الأمر المحير هو سبب كتابة [].constructor بهذه الطريقة ولكن دون الإبلاغ عن خطأ. أحدهما منشئ يريد الحصول على القيمة المباشرة للكائن، والآخر مجرد منشئ يريد الحصول على القيمة المباشرة لـ. المصفوفة.
بالطبع، إضافة متغير لتلقيه لن يسبب خطأ.
فار ج = {}.constructor;
نفس الوضع هو مثل
var fn = function(){}() لن يبلغ عن خطأ.
في الواقع، فإن "أولوية البيان" لـ js هي التي تسبب المشاكل، أي أنه يُفهم {} على أنه كتلة عبارة مركبة (دلالي 1) بدلاً من دلالات كائن حرفي (دلالي 2) أو وظيفة معلنة ( الدلالية 3).
function(){}()، تُفهم الأقواس المتعرجة على أنها عبارات مركبة. بطبيعة الحال، يكون بناء جملة وظيفة تعريف الوظيفة () السابقة غير مكتمل، مما يتسبب في حدوث خطأ أثناء تحليل بناء الجملة.
{}.constructor، يتم فهم الأقواس المتعرجة على أنها عبارات مركبة، ويتبع عامل النقطة الأقواس المتعرجة إذا لم يكن هناك كائن معقول قبل عامل النقطة، فسيتم الإبلاغ عن خطأ بشكل طبيعي.
الإصلاح معروف جيدًا: إضافة عامل الإكراه ()
(function(){})(), (function(){});// فرضها على أنها وظيفة (دلالية 3)، "function()" تعني تنفيذ الوظيفة، أي يتم تنفيذها على الفور بعد الإعلان.
({}).constructor //({}) يفرض فهم الأقواس المتعرجة على أنها كائنات حرفية (دلالات 2). "Object.xx" يعني الحصول على أعضاء الكائن، وبطبيعة الحال، يمكن تنفيذ عامل النقطة اللاحق بشكل طبيعي .