الكلمات السابقة
تختلف معلمات وظائف JavaScript عن وظائف الوظائف في معظم اللغات الأخرى. لا تمانع الوظائف في عدد المعلمات التي يتم تمريرها ، ولا تهتم بنوع بيانات المعلمات التي تم تمريرها ، ولا يمكنها حتى تمرير المعلمات.
الحجج
لا يحدد تعريف الوظيفة في JavaScript نوع معلمات الوظيفة ، ولا تقوم استدعاء الوظيفة بأي نوع تحقق من قيم المعلمة التي تم تمريرها. في الواقع ، لا تتحقق مكالمات وظيفة JavaScript من عدد المعلمات الرسمية الواردة.
وظيفة إضافة (x) {return x+1 ؛} console.log (add (1)) ؛ // 2console.log (add ('1')) ؛ // '11'console.log (add ()) ؛ // nanconsole.log (add (1،2)) ؛ // 2المعلمات الرسمية بنفس الاسم
في الوضع غير الشريط ، يمكن أن تظهر معلمة رسمية تحمل نفس الاسم في الوظيفة ، ولا يمكن الوصول إلى المعلمة الرسمية الأخيرة فقط من الاسم الذي يبدو
وظيفة إضافة (x ، x ، x) {return x ؛} console.log (add (1،2،3)) ؛ // 3في الوضع الصارم ، يحدث خطأ في بناء الجملة عندما يشارك الاسم نفسه في خطأ بناء الجملة.
وظيفة إضافة (x ، x ، x) {'استخدم صارم' ؛ إرجاع x ؛} console.log (إضافة (1،2،3))عدد المعلمات
عندما يكون العدد المحدد من المعلمات الرسمية المعلنة بواسطة الوظيفة المرجعية الحقيقية صغيرة ، سيتم تعيين المعلمات الرسمية المتبقية على قيم غير محددة
وظيفة إضافة (x ، y) {console.log (x ، y) ؛ // 1 undefined} add (1) ؛استخدم المنطق أو المشغلين في كثير من الأحيان لتعيين قيمة افتراضية معقولة للمعلمات المحذوفة
وظيفة إضافة (x ، y) {y = y || 2 ؛ console.log (x ، y) ؛ // 1 2} add (1) ؛[ملاحظة] في الواقع ، باستخدام y || 2 ليس صارمًا ، وستحصل على نفس النتيجة غير المحددة (غير محددة ، فارغة ، خاطئة ، 0 ، -0 ، '' ، nan) نفس النتيجة. لذلك ، يجب تعيينه بشكل معقول على السيناريو الفعلي
عندما يكون هناك العديد من الحجج الحقيقية ، لا يمكن الحصول على الحجج الحقيقية المتبقية مباشرة. تحتاج إلى استخدام كائن الوسائط المذكور قريبًا.
يتم تمثيل المعلمات في JavaScript داخليًا بواسطة صفيف. تستقبل الوظيفة هذه الصفيف دائمًا ، ولا تهتم بالمعلمات الموجودة في الصفيف. يمكن الوصول إلى مجموعة المعلمة هذه من خلال كائن الوسائط في جسم الوظيفة ، وبالتالي الحصول على كل معلمة تم تمريرها إلى الوظيفة. كائن الوسائط ليس مثيلًا للمصفوفة ، فهو كائن صفيف يمكنه الوصول إلى كل عنصر منه باستخدام بناء جملة قوس مربع.
الوظيفة إضافة (x) {console.log (الوسائط [0] ، وسيطات [1] ، وسيطات [2]) // 1 2 3 3Return x+1 ؛} إضافة (1،2،3) ؛تعرض سمة الطول لكائن الوسائط عدد المعلمات الحقيقية ، وتظهر سمة الطول للدالة عدد المعلمات الرسمية
وظيفة إضافة (x ، y) {console.log (encuments.length) // 3return x+1 ؛} add (1،2،3) ؛ console.log (add.length) ؛ // 2المعلمات الرسمية مريحة فقط ، ولكن ليست ضرورية
الوظيفة ADD () {عودة وسيطات [0] + وسيطات [1] ؛} console.log (إضافة (1،2)) ؛ // 3معلمات الكائن
عندما تحتوي الدالة على أكثر من 3 معلمات رسمية ، فمن الصداع حقًا أن نتذكر أن الترتيب الصحيح للمعلمات الفعلية في الوظيفة يسمى.
دالة arraycopy (/*array*/from ،/*index*/form_start ،/*array*/to ،/*index*/to_start ،/*integer*/length) {// toDo}تمرير المعلمات في شكل أزواج الاسم/القيمة ، وبالتالي فإن ترتيب المعلمات غير ذي صلة. عند تحديد وظيفة ، تتم كتابة تمريرها في المعلمات الحقيقية في كائن منفصل. يتم تمرير كائن عند استدعاء. أزواج الاسم/القيمة في الكائن هي بيانات المعلمة الحقيقية المطلوبة حقًا.
وظيفة easycopy (args) {arraycopy (args.from ، args.form_start || 0 ، args.to ، args.to_start || 0 ، args.length) ؛} var a = [1،2،3،4] ، b = []متزامن
عندما يظل عدد المعلمات الفعلية للنموذج المشارك في نفس الشكل ، قيمة كائن الوسائط وقيمة المعلمات الرسمية المقابلة متزامنة
اختبار الوظيفة (num1 ، num2) {console.log (num1 ، وسيطات [0]) ؛ // 1 1 arguments [0] = 2 ؛ console.log (num1 ، الوسيطات [0]) ؛ // 2 2num1 = 10 ؛ console.log (num1 ، enduments [0]) ؛ // 10 10} (1) ؛[ملاحظة] على الرغم من أن المعلمات المسماة وقيمة كائن الوسائط المقابلة هي نفسها ، إلا أنها ليست هي نفس مساحة الاسم. مساحات أسمائهم مستقلة ، لكن القيم متزامنة
ومع ذلك ، في الوضع الصارم ، تكون قيم كائن الوسائط وقيم المعلمات الرسمية مستقلة
اختبار الوظيفة (num1 ، num2) {'use strict' ؛ console.log (num1 ، mations [0]) ؛ // 1 1 arguments [0] = 2 ؛ console.log (num1 ، acments [0]) ؛ // 1 2num1 = 10 ؛ console.log (num1 ، encision [0]) ؛ // 10 2} (1) ؛عندما لا يكون للمعلمات الرسمية معلمات فعلية مقابلة ، فإن قيمة كائن الوسائط لا تتوافق مع قيمة المعلمات الرسمية
اختبار الوظيفة (num1 ، num2) {console.log (num1 ، الوسيطات [0]) ؛ // undefined ، undefinednum1 = 10 ؛ وسيطات [0] = 5 ؛ console.log (num1 ، وسيطات [0]) ؛ // 10،5} test () ؛الخصائص الداخلية
【Callee】
يحتوي كائن الوسائط على خاصية تسمى Callee ، وهي مؤشر للوظيفة التي تمتلك كائن الوسائط.
فيما يلي الوظيفة العليا الكلاسيكية
وظيفة Factorial (num) {if (num <= 1) {return 1 ؛} آخر {return num* factorial (num-1) ؛}} console.log (factorial (5)) ؛ // 120ومع ذلك ، فإن تنفيذ الوظيفة أعلاه مقترنة بشكل وثيق مع اسم الوظيفة ، ويمكن القضاء على فصل الوظيفة باستخدام الوسيطات. callee
وظيفة Factorial (num) {if (num <= 1) {return 1 ؛} else {return num* enduces.callee (num-1) ؛}} console.log (factorial (5)) ؛ // 120ولكن في الوضع الصارم ، فإن الوصول إلى هذه الخاصية سوف يرمي خطأ من النوع
Function Factorial (num) {'use strict' ؛ if (num <= 1) {return 1 ؛} else {return num* ediuments.callee (num-1) ؛في هذا الوقت ، يمكن استخدام تعبير وظيفة مسمى
var factorial = function fn (num) {if (num <= 1) {return 1 ؛} else {return num*fn (num-1) ؛}} ؛ console.log (Factorial (5)) ؛ // 120【المتصل】
هناك بالفعل سمتان للمتصل
【1】 دالة المتصل
تحتوي خاصية المتصل للدالة على إشارة إلى الوظيفة التي تستدعي الوظيفة الحالية. إذا تم استدعاء الوظيفة الحالية في النطاق العالمي ، فإن قيمتها خالية
دالة OUTER () {inner () ؛} الدالة inner () {console.log (inner.caller) ؛ // outer () {inner () ؛}} outer () ؛ دالة inner () {console.log (inner.caller) ؛ // null} inner () ؛في الوضع الصارم ، سيؤدي الوصول إلى هذه الخاصية إلى إلقاء خطأ من النوع
وظيفة Inner () {'use strict' ؛ // typeerror: 'caller' و "الوسيطات" هي خصائص وظيفية مقيدة ولا يمكن الوصول إليها في هذا contextConsole.log (inner.caller) ؛} inner () ؛【2】 وسيطات كائن كائن المتصل
هذه الخاصية دائما غير محددة. يتم تعريف هذه الخاصية لتمييز خصائص المتصل للوسائط.
دالة Inner (x) {console.log (enduments.caller) ؛ // undefined} inner (1) ؛وبالمثل ، في الوضع الصارم ، سوف يلقي الوصول إلى هذه الخاصية خطأ من النوع
الوظيفة الداخلية (x) {"استخدم صارم" ؛ // typeerror: "المتصل" و "الوسيطات" خصائص وظيفية مقيدة ولا يمكن الوصول إليها في هذا contextConsole.log (encilities.caller) ؛} inner (1) ؛وظائف الزائد
لا يمكن لوظائف JavaScript تنفيذ التحميل الزائد كما بالمعنى التقليدي. في لغات أخرى ، يمكن كتابة تعريفين لدالة ، طالما أن توقيعات هذين التعاريف (أنواع وكميات المعلمات المقبولة) مختلفة
لا تحتوي وظيفة JavaScript على أي توقيع لأن معلماتها ممثلة بمجموعة تحتوي على 0 أو أكثر من القيم. بدون توقيعات الوظيفة ، يكون التحميل الزائد الحقيقي مستحيلًا
.
لا يمكن محاكاة التحميل الزائد للطرق إلا عن طريق التحقق من أنواع وكميات المعلمات في الوظيفة التي تم تمريرها وصنع ردود فعل مختلفة.
دالة doadd () {if (enduments.length == 1) {تنبيه (وسيطات [0] + 10) ؛} آخر إذا (الوسيطات.مرور المعلمة
يتم تمرير جميع الوظائف في JavaScript حسب القيمة. بمعنى أن نسخ القيمة خارج الوظيفة إلى المعلمات داخل الوظيفة هو نفسه نسخ القيمة من متغير إلى آخر
【1】 قيمة النوع الأساسي
عند تمرير قيمة النوع البدائي إلى معلمة ، يتم نسخ القيمة التي تم تمريرها إلى متغير محلي (عنصر كائن معلمة أو وسيطات محددة)
الوظيفة Addten (num) {num += 10 ؛ return num ؛} var count = 20 ؛ var result = addten (count) ؛ console.log (count) ؛ // 20 ، no Change console.log (result) ؛ // 30【2】 قيمة نوع المرجع
عند تمرير قيمة نوع المرجع إلى المعلمة ، سيتم نسخ عنوان هذه القيمة في الذاكرة إلى متغير محلي ، وبالتالي فإن تغيير هذا المتغير المحلي سوف ينعكس خارج الوظيفة
وظيفة setName (obj) {obj.name = 'test' ؛} var person = new Object () ؛ setName (person) ؛ console.log (person.name) ؛ // 'test'عندما يتم تجاوز المعلمات الرسمية لنوع المرجع داخل الوظيفة ، يشير هذا المتغير إلى كائن محلي. سيتم تدمير هذا الكائن المحلي فور تنفيذ الوظيفة
دالة setName (obj) {obj.name = 'test' ؛ console.log (person.name) ؛ // 'test'obj = new Object () ؛ obj.name =' white '؛ console.log (person.name) ؛ //' test '} var person () ؛ setName (person) ؛ما سبق هو الفهم المتعمق لمعلمات وظيفة JavaScript التي أدخلها المحرر لك (موصى بها). آمل أن يكون ذلك مفيدًا لك. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة لي وسوف يرد المحرر إليك في الوقت المناسب. شكرا جزيلا لدعمكم لموقع wulin.com!