تصف هذه المقالة بالتفصيل طرق تعريف الوظيفة المشتركة المختلفة في JavaScript ، ويتم مشاركتها معك للرجوع إليها. التحليل المحدد هو كما يلي:
أولاً ، دعنا نلقي نظرة على تعريفات الوظائف الأربعة الأكثر شيوعًا في JavaScript:
الوظيفة المحددة مع مُنشئ الوظيفة ، الرمز كما يلي:
var multiply = وظيفة جديدة ('x' ، 'y' ، 'return x * y ؛') ؛إعلان الوظيفة ، هذه الطريقة هي أيضًا الأكثر شيوعًا:
دالة مضاعفة (x ، y) {return x * y ؛}تعبيرات الوظائف ، التي تم الإعلان عنها كدالة مجهولة ، ثم تم تعيينها لمتغير ، هي طرق شائعة جدًا:
var multiply = function (x ، y) {return x * y ؛}تعبير الوظيفة ، لكن إعلان الوظيفة هو وظيفة مسموحة ، ثم تم تعيين قيمة لمتغير ، والذي يشبه تمامًا نفس الطريقة:
var multiply = function multi (x ، y) {return x * y ؛}أولاً ، دعنا نقارن اسم الوظيفة والعلاقة المباشرة بين متغير الوظيفة المعين للوظيفة. إنه حقًا قليلاً ... أن تكون أكثر سهولة ، من المثال 4 الآن ، إنها العلاقة بين متغير الوظيفة الضاعف واسم الوظيفة Multi:
لا يمكن تعديل أسماء الوظائف ، على العكس من ذلك ، يمكن إعادة تعيين متغيرات الوظائف. يجب أن يكون من السهل فهم أنه يمكن إعادة تعيين متغيرات الوظائف. في المثال الرابع لدينا ، المتغير المضاعف الذي تم تعريفه للتو ، ليس من الجيد رؤيته ، وإعادة تعيينه إلى:
multiply = function (x ، y) {return x + y ؛}لقد حولت نفسي على الفور من الضرب إلى الإضافة. ومع ذلك ، من المستحيل تغيير متغير الوظيفة المتعددة. تعريف الوظيفة موجود بالفعل. طالما أنها لا تزال تحتفظ بمرجعها ، فلن تتغير. قد لا يكون من السهل فهمه هنا. فكر في الأمر مثل هذا أولاً ، وانظر إلى الأسفل ، ويجب أن تكون قادرًا على فهمه ببطء.
لا يمكن استخدام اسم الوظيفة خارج الوظيفة في نفس الوقت ، فهو مرئي فقط داخل جسم الوظيفة. مثال بسيط للغاية:
var foo = function bar () {Alert ('hello') ؛} foo () ؛ // proper "hello" string bar () ؛ // تنفيذ خطأ ، لا يتم تعريف الشريطومن الواضح أن الشريط هنا هو بالفعل اسم وظيفة ، ولكن لا يمكن أن يطلق عليه حقًا خارجيًا. في هذا الوقت ، سيكون هناك بالتأكيد أحذية للأطفال يسألون لماذا لا يزال هذا المثال يبدو جيدًا ، تمامًا مثل المثال 4 ، لماذا لا تستخدم طريقة المثال 2؟ سؤال جيد ، اسمحوا لي أن كسرها ببطء.
مع الاستمرار في المثال 4 ، يمكننا أن نرى أن اسم الوظيفة (Multi) ومتغير الوظيفة (Multiply) ، ليسا متماثلين ، ولكن في الواقع ، لا يتمتع الاثنان على الإطلاق ، لذلك ليست هناك حاجة للحفاظ على الاتساق. عند الحديث عن هذا ، أعتقد أنه ينبغي تقليل الأمثلة الأربعة أعلاه إلى 3 ، ويجب أن يكون المثال 2 والمثال 4 ثابتًا بشكل أساسي. ماذا ، لا تصدق ذلك؟ ههههههههههههههههههه
لقد وجدنا أنه بالمقارنة مع المثال 2 والمثال 4 ، لا يوجد سوى عدد أقل من متغيرات وظيفة VAR ، في حين مقارنة بالمثال 3 ، لا يوجد سوى اسم الوظيفة هذا. من وجهة نظر الظاهرة ، فإن جوهر المثال 2 والمثال 4 متماثلان ، والأدلة هي كما يلي:
دالة foo () {} ALERT (FOO) ؛ // يطالب اسم الوظيفة الذي يحتوي على "foo" var bar = foo ؛ Alert (bar) ؛ // يطالب اسم الوظيفة لا يزال يحتوي فقط على "فو" ، وليس له علاقة مع بارإنه بالفعل Ironclad؟ هل هي الطريقة لكتابة الكود أعلاه مماثل للمثال 2 مع الرموز في المثال 4؟ صحيح ، هذا ما قلته للتو أن الاثنين يجب أن يكونا هو نفسه. ومع ذلك ، عند تحديد الوظيفة في الحالة 2 ، ساعدنا محرك JS على القيام بشيء ما ، مثل إعلان وظيفة مع تضرر اسم الوظيفة ، وتحديد متغير أيضًا يسمى أيضًا Multiply ، ثم تعيينه لهذا المتغير ، نفس الأسماء تمامًا. لقد اعتقدنا أنه عند استخدام اسم الوظيفة المضاعف ، كنا نستخدم متغير الوظيفة في الواقع ، لذلك كنا بالدوار - لأكون صادقًا ، كنت أيضًا بالدوار ~ باختصار ، عندما اتصلنا ، أطلقنا على متغير الوظيفة ، ولم يتمكن اسم الوظيفة من استدعاء الوظيفة خارجيًا ، لذلك كان لديّ الاستدلال أعلاه.
ومع ذلك ، فإن الاختلاف البسيط الذي يجب ذكره هنا هو أن الوظيفة المحددة بواسطة طريقة إعلان الوظيفة تختلف عن إعلان المنشئ أو إعلان تعبير الوظيفة ، يمكن استدعاء طريقة إعلان الوظيفة قبل تعريف الوظيفة ... ناهيك ، فقط انظر إلى الكود:
foo () ؛ // tip foofunction foo () {Alert ('foo') ؛} bar () ؛ // Buddy ، إنه مختلف حقًا عن ما سبق ، لذلك لا تظهر. أليس هذا خطأ؟ لا يتم تعريف شريط المطالبة var bar = function () {Alert ('bar') ؛}دعنا نتحدث عن الوظائف التي أعلنها المنشئ. لن ترث الوظائف المعلنة نطاق الموقع المعلن الحالي. سيكون لديهم نطاق عالمي فقط بشكل افتراضي. ومع ذلك ، هذا هو نفسه في طرق إعلان وظائف أخرى ، على النحو التالي:
دالة foo () {var hi = 'hello' ؛ // return function () {// ALERT (HI) ؛ //} ؛ وظيفة الإرجاع ('return hi ؛') ؛} foo () () ؛ // لتأثير التنفيذ ، يرجى الجري ورؤية بنفسكيمكن تخيل أن تنفيذ الوظيفة التي يتم إرجاعها باستخدام إعلان المنشئ سيبلغ حتماً عن خطأ لأن المتغير HI ليس في نطاقه (أي النطاق العالمي).
نقطة أخرى هي أن الناس غالباً ما يقولون إن الوظائف المعلنة في وضع المنشئ غير فعالة. لماذا هذا؟ اليوم ، تعلمت من المستند أن الوظائف التي تم إعلانها بطرق الثلاث الأخرى لن يتم تحليلها إلا مرة واحدة. في الواقع ، فهي موجودة في الإغلاق ، ولكن هذا يرتبط فقط بسلسلة النطاق ، وسيتم تحليل جسم الوظيفة مرة واحدة فقط. لكن طريقة المنشئ هي أنه في كل مرة يتم تنفيذ وظيفة ما ، سيتم تحليل جسم الوظيفة مرة واحدة. يمكننا أن نعتقد أن الوظيفة المعلنة بهذه الطريقة هي كائن ، يخزن المعلمات وجسم الوظيفة. في كل مرة يتم تنفيذها ، يجب تحليلها مرة واحدة ، وسيتم تنفيذ المعلمات وجسم الوظيفة ، والتي ستكون غير فعالة بشكل حتمي. لا تعرف كيف تقوم بالتجربة المحددة؟
أخيرًا ، دعنا نتحدث عن شيء لا أحد ينتبه إليه. عندما يبدو الأمر وكأنه طريقة إعلانات الوظيفة ليست طريقة حياة الوظيفة (لا تزال تميل إلى وضعها ببساطة ، عندما تصبح طريقة المثال 2 بطريقة أخرى عن غير قصد):
عندما يصبح جزءًا من التعبير ، يكون مثل المثال 3 والمثال 4.
لم يعد "عنصر المصدر" للنص نفسه أو الوظيفة. ما هو عنصر المصدر؟ وهذا هو ، بيان غير متداخل في البرنامج النصي أو جسم الوظيفة ، مثل:
var x = 0 ؛ // عنصر المصدر if (x == 0) {// مصدر العنصر x = 10 ؛ // ليس عنصرًا مصدرًا ، لأنه متداخل في وظيفة IF BOO () {} // ليس عنصرًا مصدرًا ، لأنه متداخل في IF stater} foo () {// source element var y = 20 ؛ // Source Element Function Bar () {} // عنصر المصدر بينما (y == 10) {// وظيفة عنصر المصدر plah () {} // ليس عنصر مصدر ، لأنه متداخل في البيان y ++ ؛ // ليس عنصر مصدر ، لأنه متداخل في بيان الوقت}}لقد فهمت تقريبًا مفهوم عناصر المصدر. سأستمر في إعلان الوظيفة الذي ذكرته للتو. من فضلك انظر:
// وظيفة إعلان الوظيفة وظيفة foo () {} // تعبير الوظيفة (الدالة bar () {}) // وظيفة التعبير x = function hello () {} if (x) {// function function function world () {}}أخيرًا ، اسمحوا لي أن أتحدث عن فهمي. سبب التمييز بين إعلان الوظيفة والإعلان غير الوظيفي هو أنه في رأيي ، سيتم الإعلان عن تعريف الوظيفة لطريقة إعلان الوظيفة مقدمًا عند تنفيذ محرك تحليل JS. وهذا هو ، كما قلنا للتو أعلاه ، يمكن استخدامه قبل تعريف الوظيفة. في الواقع ، قام محرك التحليل بتحليله قبل استخدامه. ومع ذلك ، فإن التصريح غير الوظيفي ، مثل إعلان وظيفة التعبير ، سيحدد محرك تحليل JS فقط المتغير الذي أعلنه VAR مقدمًا. في هذا الوقت ، تكون القيمة المتغيرة غير محددة ، والتعيين الحقيقي لهذا المتغير موجود في الموقع الفعلي للرمز. لذلك ، فإن الأخطاء المذكورة أعلاه كلها غير محددة. تم تعريف المتغير الفعلي ، ولكن لم يتم تعيينه بعد. محرك تحليل JS لا يعرف أنها وظيفة.
أعتقد أن الوصف في هذه المقالة له قيمة مرجعية معينة لتصميم برمجة الويب JavaScript.