تعريف الوظيفة والمكالمة
تحديد الوظائف. في JavaScript ، طريقة تحديد الوظائف هي كما يلي:
دالة ABS (x) {if (x> = 0) {return x ؛} else {return -x ؛}}يتم تعريف وظيفة ABS () أعلاه على النحو التالي:
تشير الوظيفة إلى أن هذا تعريف دالة ؛
ABS هو اسم الوظيفة ؛
(x) سرد معلمات الوظيفة بين قوسين ، مفصولة بمعلمات متعددة ؛
الكود بين {...} هو جسم دالة ، يمكن أن يحتوي على عدة عبارات ، أو حتى بدون أي عبارة.
ملاحظة: عند تنفيذ البيان الموجود داخل هيئة الوظيفة ، بمجرد تنفيذها للعودة ، يتم تنفيذ الوظيفة وإعادة النتيجة. لذلك ، يمكن تنفيذ التحديد الداخلي والحلقة بشكل معقد للغاية.
إذا لم يكن هناك بيان إرجاع ، فسيتم إرجاع النتيجة بعد تنفيذ الوظيفة ، ولكن النتيجة غير محددة.
نظرًا لأن وظيفة JavaScript هي أيضًا كائن ، فإن وظيفة ABS () المحددة أعلاه هي في الواقع كائن دالة ، ويمكن اعتبار اسم ABS للوظيفة بمثابة متغير يشير إلى الوظيفة.
var abs = function (x) {if (x> = 0) {return x ؛} else {return -x ؛}}وبهذه الطريقة ، الوظيفة (x) {...} هي وظيفة مجهولة لا تحتوي على اسم وظيفة. ومع ذلك ، يتم تعيين هذه الوظيفة المجهولة إلى ABS المتغير ، بحيث يمكن استدعاء الوظيفة من خلال ABS المتغير.
التعاريف معادلة تمامًا. لاحظ أن الطريقة الثانية تحتاج إلى إضافة واحدة في نهاية جسم الوظيفة وفقًا لبناء الجملة الكامل ، مما يشير إلى أن عبارة التخصيص ينتهي.
عند استدعاء وظيفة ، فقط تمرير في المعلمات بالترتيب:
القيمة المطلقة (10) ؛ // العودة 10
القيمة المطلقة (-9) ؛ // العودة إلى 9
نظرًا لأن JavaScript يتيح تمرير أي معلمة دون التأثير ، فلا توجد مشكلة في وجود معلمات أكثر من المعلمات المحددة ، على الرغم من أن هذه المعلمات ليست مطلوبة داخل الوظيفة.
ABS (10 ، 'blablabla') ؛ // العودة 10
ABS (-9 ، 'haha' ، 'Hehe' ، null) // العودة إلى 9
لا توجد مشكلة في عدد أقل من المعلمات من المحددة
ABS () ؛ إرجاع نان
في هذا الوقت ، ستتلقى المعلمة x من وظيفة ABS (x) غير محددة ونتيجة الحساب هي NAN
دالة ABS (x) {if (typeof x! == 'number') {رمي 'ليس رقمًا:} if (x> = 0) {return x ؛} else {return -x ؛}}الحجج
لدى JavaScript أيضًا وسيطات كلمات رئيسية مجانية ، والتي تعمل فقط داخل الوظيفة وتشير دائمًا إلى جميع المعلمات التي يتم تمريرها بواسطة المتصل بالوظيفة الحالية.
وظيفة foo (x) {Alert (x) ؛ // 10 for (var i = 0 ؛ i <enduments.length ؛ ++) {Alert (mations [i]) ؛ // 10،20،30}} FOO (10.20،30)مع الوسائط ، يمكنك الحصول على جميع المعلمات التي يمر بها المتصل. وهذا يعني ، حتى لو لم تحدد الوظيفة أي معلمات ، لا يزال من الممكن الحصول على قيمة المعلمة:
دالة ABS () {if (endressions.length === 0) {return 0 ؛} var x = enduments [0] return x> = 0؟ x: -x ؛} abs () ؛ // 0abs (10) ؛ // 10abs (-9) // 9في الواقع ، يتم استخدام الحجج بشكل شائع لتحديد عدد المعلمات الواردة. قد ترى هذه الكتابة:
// foo (a [، b] ، c)
// قبول 2 ~ 3 المعلمات ، B هي معلمة اختيارية. إذا تم إدخال معلمتين فقط وخرجان منهما ، فهو B هو فارغ افتراضيًا
الدالة foo (a ، b ، c) {if (encuments.length === 2) {// المعلمات الفعلية التي تم الحصول عليها هي A و BC غير محددة = b ؛ b = null ؛ // B تصبح القيمة الافتراضيةلتغيير المعلمة الوسطى B إلى معلمة "اختيارية" ، يمكنك فقط الحكم عليها من خلال الوسائط ، ثم إعادة ضبط المعلمات وتعيين القيم.
معلمة REST
نظرًا لأن وظائف JavaScript تسمح بتلقي أي معلمة ، يتعين علينا استخدام الوسائط للحصول على جميع المعلمات عند مواجهة المشكلات:
الدالة foo (a ، b) {var i ، rest = [] ؛ if (encision.length> 2) {for (i = 2 ؛ i <enduments.length ؛ i ++) {rest.push (enciles [i]) ؛}} console.log ('a =' + a) ؛ console.log ('b =' + b) ؛من أجل الحصول على معلمات أخرى غير المعلمات المحددة A و B ، يتعين علينا استخدام الوسائط ، وتبدأ الحلقة من الفهرس 2 لاستبعاد المعلمتين الأوليين. طريقة الكتابة هذه محرجة ، فقط للحصول على معلمة REST الإضافية. هل هناك طريقة أفضل؟
يقدم معيار ES6 معلمة REST ، ويمكن إعادة كتابة الوظيفة أعلاه على النحو التالي:
وظيفة foo (a ، b ، ... rest) {console.log ('a =' + a) ؛ console.log ('b =' + b) ؛ console.log (rest) ؛} foo (1،2،3،4،5) ؛ // result // a = 1 // b = 2 // array [3،4،5]لا يمكن كتابة معلمة REST إلا في النهاية ، ويتم تمييزها ... من نتيجة التشغيل. من نتيجة العملية ، يمكننا أن نرى أن المعلمات التي تم تمريرها مرتبطة بـ A ، B ، ويتم تسليم المعلمات الإضافية إلى الباقي المتغير في صفيف ، لذلك ،
نحصل على جميع المعلمات دون الحاجة إلى الحجج.
إذا لم يتم ملء المعلمات التي تم تمريرها بالمعلمات العادية المحددة ، فلا يهم ، فستتلقى المعلمة REST صفيفًا فارغًا (لاحظ أنه غير محدد).
بيان العودة
ذكرنا في وقت سابق أن محرك JavaScript لديه آلية لإضافة Semicolons تلقائيًا في نهاية الخط ، مما قد يتسبب في سقوطك في حفرة كبيرة في بيان العودة:
دالة foo () {return {name: 'foo'} ؛} foo () ؛ // {name: 'foo'}ملحوظة:
دالة foo () {return: // تمت إضافة فاصلة منقوطة تلقائيًا ، وهو ما يعادل إرجاع {name: 'foo'} ؛ // لم يعد من الممكن تنفيذ خط البيان. }لذا فإن الطريقة الصحيحة لكتابة خطوط متعددة هي
الدالة foo () {return {// لن يتم إضافة Semicolon تلقائيًا هنا لأنه يعني أن البيان لم ينتهي بعد. الاسم: 'foo'}}نطاق متغير
في JavaScript ، ما تم إعلانه مع VAR هو في الواقع تحديد النطاق.
إذا تم الإعلان عن متغير داخل جسم الوظيفة ، فإن نطاق المتغير هو جسم الوظيفة بأكمله ، ويجب عدم الرجوع إلى المتغير خارج جسم الوظيفة.
'use strict': function foo () {var x = 1 ؛ x = x +1 ؛} x = x +2 ؛ // لا يمكن أن يشير RistrenceerRor إلى المتغير x خارج الوظيفةإذا أعلن كل من وظيفتين مختلفتين نفس المتغير ، فإن المتغير يعمل فقط داخل الجسم من وظائف كل منهما. بمعنى آخر ، تكون المتغيرات ذات الاسم نفسه داخل وظائف مختلفة مستقلة عن بعضها البعض ولا تؤثر على بعضها البعض:
'use struct': function foo () {var x = 1 ؛ x = x +1 ؛} bar () {var x = 'a' ؛ x = x + 'b' ؛}نظرًا لأن وظائف JavaScript يمكن أن تتداخل ، يمكن للوظيفة الداخلية الوصول إلى المتغيرات المحددة بواسطة وظائف خارجية ، والعكس غير ذلك هي:
'use strict' ؛ function foo () {var x = 1 ؛ function bar () {var x = 1 ؛ function bar () {var y = x +1 ؛ // BAR يمكنه الوصول إلى المتغير x من foo z = y + 1 ؛ // Referenceerror! لا يمكن لـ Foo الوصول إلى المتغير y من الشريط! }}ماذا لو تضاعفت الأسماء المتغيرة للوظائف الداخلية والخارجية؟
'use strict': function foo () {var x = 1 ؛ function bar () {var x = 'a' ؛ alert ('x in bar () =' + x) ؛ // 'a'} تنبيه ('x في foo () =' + x) // 1bar () ؛}تعزيز متغير
يحتوي تعريف وظيفة JavaScript على ميزة ، والتي ستقوم أولاً بمسح بيان جسم الوظيفة بالكامل و "ترقية" جميع المتغيرات المعلنة إلى أعلى الوظيفة:
"استخدام صارم" ؛ دالة foo () {var x = 'hello ،'+y ؛ Alert (x) ؛ var y = 'bob' ؛} foo () ؛بالنسبة لوظيفة FOO () أعلاه ، فإن الكود الذي يراه محرك JavaScript يعادل:
دالة foo () {var y ؛ // ارفع var x للمتغير y = 'hello' + y ؛ ALERT (x) ؛ y = 'bob' ؛}نظرًا لهذه "السمة" الغريبة لجافا سكريبت ، عندما نحدد المتغيرات داخل وظيفة ما ، يرجى الالتزام الصارم بالقاعدة "لإعلان جميع المتغيرات أولاً داخل وظيفة". الطريقة الأكثر شيوعًا هي استخدام VAR لإعلان جميع المتغيرات المستخدمة داخليًا في الوظيفة:
دالة foo () {var x = 1 ، // x تتم تهيئة إلى 1y = x +1 ، // y تتم تهيئة إلى 2z ، i ؛ // z وأنا غير محدد // عبارات أخرى لـ (i = 0 ؛ i <100 ؛ i ++) {...}}النطاق العالمي
المتغيرات غير المحددة في أي وظيفة لها نطاق عالمي. في الواقع ، لدى JavaScript متغيرًا عالميًا في المنتشر افتراضيًا يرتبط فعليًا بخاصية النافذة.
"استخدام صارم" ؛ var source = 'Learn JavaScript' ؛ Alert (course) ؛ // 'Learn JavaScript' ؛ Alert (window.course) ؛ // "تعلم JavaScript"
مساحة الاسم
سوف تكون المتغيرات العالمية ملزمة بالنافذة. تستخدم ملفات JavaScript المختلفة نفس المتغيرات العالمية ، أو لها نفس الاسم وظائف المستوى الأعلى ، والتي ستسبب
تسمية النزاعات ويصعب اكتشافها.
تتمثل إحدى طرق تقليل الصراع في ربط جميع متغيراتك ووظائفك في متغير عالمي.
// المتغير Quju الوحيد myappvar myapp = {} ؛ // متغيرات أخرى: myapp.name = 'myapp' ؛ myapp.version = 1.0 ؛ // وظائف أخرى myapp.foo = function () {return 'foo' ؛} ؛إن وضع كل رمزك في مساحة الاسم الفريدة سوف يقلل MyApp بشكل كبير من إمكانية وجود تعارضات متغيرة عالمية.
النطاق المحلي
نظرًا لأن النطاق المتغير لـ JavaScript موجود في الواقع داخل وظيفة ، لا يمكننا تحديد المتغيرات التي لا يمكن تعريفها في كتل العبارات مثل الحلقات.
دالة foo () {for (var i = 0 ؛ i <100 ؛ i ++) {//} i+= 100 ؛ // لا يزال من الممكن الرجوع إلى المتغيرات ؛}لحل نطاق مستوى الكتلة ، قدم ES6 كلمة رئيسية جديدة ، وبدلاً من VAR ، يمكنك إعلان متغير نطاق مستوى الكتلة:
الدالة foo () {var sum = 0 ؛ for (دع i = 0 ؛ i <100 ؛ i ++) {sum += i ؛} i += 1 ؛}ثابت
نظرًا لأن VAR و LET DECRAY ROPLABLES ، إذا كنت ترغب في إعلان ثابت ، فلن يعمل ذلك قبل ES6. عادة ما نستخدم جميع متغيرات رأس المال للإشارة إلى أن هذا ثابت
لا تعدل قيمتها.
var pi = 3.14 ؛
يقدم معيار ES6 كلمة رئيسية جديدة لتحديد الثوابت ، سواء const أو اترك نطاقًا على مستوى الكتلة ؛
const pi = 3.14 ؛
PI = 3 ؛ // بعض المتصفحات لا يبلغ عن أخطاء ، ولكن ليس لها أي تأثير.
باي؛ // 3.14
تحليل JavaScript Basic Parics_IN التعمق للمتغيرات والنطاق هو كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.